LINUX.ORG.RU

[С++] facepalm

 


0

0

...Как обычно, модельный кусочек кода:

for(int i=0; i<n; i++) {
  for(int i=0; str[i]; i++) {
    str[i] = tolower(str[i]);
  }
}

Boost... STL... Qt... Реальность - она выше по тексту :(

Как это говно потом сопровождать? Быть может, я слишком эстет? :) Ваше мнение?


бессмысленно и беспощадно

lester ★★★★
()
Ответ на: комментарий от lester

Кусочек-то - модельный. Разбавь на 4 экрана кодом одной функции. И понятность станет примерно как сейчас у меня в проекте. :)

impfp
() автор топика

цикл по целочисленной переменной зло. спасут мир итераторы и foreach (в нормальных языках).

amomymous ★★★
()

кодеры мелкософта рвутся в опенсурц? нет пути!

arsi ★★★★★
()
Ответ на: комментарий от lester

Поясни мне, глупому.
У меня парсинг дедлочится на использовании одной переменной в вложенном и родительском цикле как на смертельном грехе.

tia
()
Ответ на: комментарий от tia

> Поясни мне

возможно у него разбитая на токены строка, которые он хотел одним махом привести к нижнему регистру, хотя хз конечно

lester ★★★★
()
Ответ на: комментарий от tia

Код рабочий. Области видимости разные.
А стиль - даже не просто вырвиглазный...

impfp
() автор топика

Интересно, а какое i будет использоваться внутри вложенного цикла? А вообще, я так понял, строка str n раз будет преобразована в нижний регистр? Кстати, интересный способ реализации usleep() со случайным параметром :)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

> Интересно, а какое i будет использоваться внутри вложенного цикла?

уже написали, в стандарте все четко расписано про области видимости

lester ★★★★
()
Ответ на: комментарий от lester

Т.е. внутри под-цикла будет i под-цикла? А внешнего - i внешнего?
Просто проверяю.
Вообще, когда видишь быдлокод, появляется масса действительно детских вопросов, на которых можешь запороться на собеседованиях...

tia
()

нормальный код. Главное — это простые и понятные интерфейсы, а не такие мелочи.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Только объясните мне, зачем n раз переводить строку в нижний регистр? Или это действительно вместо usleep?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от dilmah

рабочий код. Главное — это простые и понятные интерфейсы, а не такие мелочи.

fixed

Разница между рабочим и нормальным бывает существенной.
Как пример - в процессе рефакторинга.

impfp
() автор топика
Ответ на: комментарий от impfp

> Разница между рабочим и нормальным бывает существенной.
> Как пример - в процессе рефакторинга.

√-1

arsi ★★★★★
()

Хм.. не знаток C++: но разве tolower(str[i]) применяется не ко всей строке i? если да, то малость непонятно нахрена выравнивать регистр n + str[i].lenght раз ? ето вместо sleep()(или как там в C++ задержки делаются)? Чот хз.. странный код на самом деле..

Valor
()
Ответ на: комментарий от Valor

> Хм.. не знаток C++: но разве tolower(str[i]) применяется не ко всей строке i? если да, то малость непонятно нахрена выравнивать регистр n + str[i].lenght раз ? ето вместо sleep()(или как там в C++ задержки делаются)? Чот хз.. странный код на самом деле..

tolower применяется к i-тому символу строки, str - это массив char str[]

str[i].lenght

жаба детектед

lenght

граммар-наци негодуэ

static_lab ★★★★★
()

> Ваше мнение?

нет поддержки unicode, соответственно код гавно.

Eshkin_kot ★★
()
Ответ на: комментарий от Eddy_Em

Может, это вероятностный tolower. Может перевести символ в нижний регистр, а может и не перевести. Выполняя его n раз, мы повышаем вероятность правильного результата.

anatolat
()

Вы неправильно код читаете! Гораздо интереснее читать его, пытаясь придумать его полезное использование! Я уже полчаса себе мозги ломаю, фантазии не хватает....

svu ★★★★★
()
Ответ на: комментарий от svu

У меня этот, с позволенья сказать, код находился в функции-убивалке процессов...
ps ...мышления, наверное :)

impfp
() автор топика

Как это говно потом сопровождать? Быть может, я слишком эстет? :) Ваше мнение?

такие шедевры надо срочно в биореактор

да, работка будет вполне себе негритянская :)

shty ★★★★★
()
Ответ на: комментарий от anatolat

Может, это вероятностный tolower. Может перевести символ в нижний регистр, а может и не перевести.

:)

Eddy_Em ☆☆☆☆☆
()

объясните нерадивому шазанах этот код?

for(int i=0; i<n; i++) { 
  for(int i=0; str[i]; i++) { 
    str[i] = tolower(str[i]); 
  } 
} 

области видимости переменных i не пересекаются во внешнем и вложенном цикле. значение n не детерминировано во внешнем цикле. значение i во внутреннем цикле =0. это получается n раз преобразовать первый символ str tolower? это такой аналог nop из assembler'а или костыльная реализация sleep() ?

UnknownUser
()
Ответ на: комментарий от UnknownUser

> начение i во внутреннем цикле =0. это получается n раз преобразовать первый символ str tolower?

а вот и вероятный автор

lester ★★★★
()
Ответ на: комментарий от UnknownUser

Спакуха, это лишь кусочек кода, как было отмечено в начале.

И меня поразил не сам код (он банален), но его стиль - использование одного имени переменной в разных смыслах (страх наделить вложенный индекс другим именем? желание кинуть понты перед возможным будущим мейнтейнером? хз), проверка конца (вложенного) цикла на соплях (хорошо, что сейчас там asciiz-строка)

impfp
() автор топика
Ответ на: комментарий от UnknownUser

Давайте разовьем тему. Может там вместо конца строки ловится исключение и в обработчике подсовывается новая строка?

madcore ★★★★★
()
Ответ на: комментарий от lester

а вот и вероятный автор

вероятностный

jtootf ★★★★★
()
Ответ на: комментарий от UnknownUser

str=0 означает конец строки. str[0]=0 значит, что строка пустая (точнее, её будут считать таковой большинство функций, заточенных под работу со строками).

shoewreck
()
Ответ на: комментарий от UnknownUser

проверил, с первого раза не все символы преобразуются. вот и нужны для уверенности n проходов.


Этот код явно не для этой цели.

Boy_from_Jungle ★★★★
()

Феерично. Как оно работает то ?

jreznot
()
Ответ на: комментарий от UnknownUser

пытаюсь понять логику и где это можно нормально применить

не пытайся, спаси свой моск

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Eddy_Em

Оригинально все выглядит примерно так:

n = daite_kolvo_strok();
for(int i=0; i<n; i++) {
  kakoy_to_kod(i);
  str = imja_sestra(i);
  for(int i=0; str[i]; i++) { 
    str[i] = tolower(str[i]); 
  }
  kakoy_to_kod_2(i);
}

Выжимка, соответственно:

for(int i=0; i<n; i++) {
  for(int i=0; str[i]; i++) { 
    str[i] = tolower(str[i]); 
  }
}
или вот подумалось, даже так:
for(int i=0; i<n; i++) {
  for(int i=0; str[i]; i++) {
  }
}

PS Однако, доставляет то, как народ чешет тему насчет того а что же этот код делает :)

impfp
() автор топика
Ответ на: комментарий от impfp

> Почитал обсуждение, согласился с тобой :)

Единственная претензия по делу - не поддерживается Unicode. Ноэто тоже может быть неважно...

tailgunner ★★★★★
()
Ответ на: комментарий от UnknownUser

проверил, с первого раза не все символы преобразуются. вот и нужны для уверенности n проходов.

У меня с первого раза работает:

[09.04 15:35 ~/tmp]
cat 2.c 
#include <stdio.h>
#include <ctype.h>

main(){
	char str[] = "ПРОВЕРКА НА ПрАвИлЬнОсТь\nTEST RIGHT ToLoWeR WoRk\n\n";
	char *ptr = str;
	do{
		*ptr = tolower(*ptr);
		ptr++;
	}while(*ptr);
	printf("было: %s", str);
	printf("стало: %s", str);
}[09.04 15:35 ~/tmp]
cat 2.c 
#include <stdio.h>
#include <ctype.h>

main(){
	char str[] = "ПРОВЕРКА НА ПрАвИлЬнОсТь\nTEST RIGHT ToLoWeR WoRk\n\n";
	char *ptr = str;
	do{
		*ptr = tolower(*ptr);
		ptr++;
	}while(*ptr);
	printf("было: %s", str);
	printf("стало: %s", str);
}
[09.04 15:35 ~/tmp]
gcc 2.c 
[09.04 15:35 ~/tmp]
./a.out 
было: ПРОВЕРКА НА ПрАвИлЬнОсТь
test right tolower work

стало: ПРОВЕРКА НА ПрАвИлЬнОсТь
test right tolower work

русские буквы, естественно, не переводит в нижний регистр - для это надо свою функцию писать.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.