Ставите ли вы пробел после скобки?
забань его.
Удаляй весь его код отовсюду, откуда увидишь 

клева!
Есть у нас один, вокруг "присваивания" всегда пробелы ставит - говорит, лучше видно..
Так что ли?
А вот так уже извратно:
x = 0Так ведь лучше читается.
А вот так уже извратно:
doSmth( param1, param2 )или
for ( i = 0; i < n; i++ ) ...
> Есть у нас один, вокруг "присваивания" всегда пробелы ставит - говорит, лучше видно..
Типа вы его лошите за это, так?
Типа вы его лошите за это, так?
Правильно говорит. Чем больше пространства - тем лучше. В разумных пределах, конечно.
Между прочим то что ты назвал извратным - очень удобно.
Может быть, просто считаю, что особой читабельности эти пробелы не добавляют, но при этом нужно лишний раз пробелится, и в связи с этим появляется лишний источник ошибок. Лично я часто либо пробел пропускаю, либо путаю местами с переменной, если она длиной в один символ 

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

Потом, должна спасать подсветка.
Я и использую. Но кто говорит что это взаимозаменяемо? Что такое + ты надеюсь знаешь? 

это не тру 

+ - это крестик.
+ - это сложение. Эти эффекты, знаешь ли, складываются.
разноцветное с пробелами утомляет сильнее чем что-нибудь одно
Я ваще в ауте от темы
Давайте для мозга дривер токенизации заинсталлим?
Тада мозгу будет пох, если вся прога через точку-с-запятой в одну строку записана будет!
ае

А!
Видишь ли, помимо повышения наглядности токенизации у системы оформления кода есть ещё несколько целей. Например, облегчение восприятия логической структуры. Использовать дополнительные пробелы и там и там невозможно, а твой + на самом деле является оператором | (вот, кстати, пример неудачного оверлоада так что пробелы после скобочек это бесполезная трата возможностей устройства вывода.
Видишь ли, помимо повышения наглядности токенизации у системы оформления кода есть ещё несколько целей. Например, облегчение восприятия логической структуры. Использовать дополнительные пробелы и там и там невозможно, а твой + на самом деле является оператором | (вот, кстати, пример неудачного оверлоада так что пробелы после скобочек это бесполезная трата возможностей устройства вывода.
if (a + (b * d) < 0) // right
if ( a + ( b * d ) < 0 ) // wrong
if ( ( a + ( b * d ) ) < 0 ) // ваще пиздец wrong
Имхо, правильно говорит.
А учитывая фактор лени:
А учитывая фактор лени:
if(a+(b*d)<0)// left : )
Я бы написал так:
Я же не говорю что пробелы надо ставить везде. Пробела перед второй скобкой и после третьей скобки вполне достаточно для изложенной мной цели.
if ( a + (b * d) < 0 )
Я же не говорю что пробелы надо ставить везде. Пробела перед второй скобкой и после третьей скобки вполне достаточно для изложенной мной цели.
Реально после if и т.п никогда пробел не ставлю.
> Если не ставить пробелы, то мозгу приходется делать токенизацию этой каши на составляющие
Фигня. Ограниченность зрения - вещь куда более серьёзная. Если строчка длинная (из-за пробелов, в частности то глазу при чтении нужно делать больше остановок. Не все владеют техникой быстрого чтения и накаченной мышцей периферического зрения.
Ведь не пишут y = f( x )
Фигня. Ограниченность зрения - вещь куда более серьёзная. Если строчка длинная (из-за пробелов, в частности то глазу при чтении нужно делать больше остановок. Не все владеют техникой быстрого чтения и накаченной мышцей периферического зрения.
Ведь не пишут y = f( x )
> Реально после if и т.п никогда пробел не ставлю.
А вот за это готов душить собственными руками. if и for всё-таки не функции.
А вот за это готов душить собственными руками. if и for всё-таки не функции.
Я так пишу.
Заходи и души, я не против. Пробелы всё равно ставить не буду. 

Я имею в виду на бумаге.
Какая нафиг токенизация... Проблема пробелов в коде - это фигня по сравнению с проблемой почерка врачей.
типа так:
Если учесть, что двоеточие в паскале в блоке не встречается больше нигде и явно бросается в глаза - считаю пробелы излишними.
ConceptId := LingFormConceptList.ResultDataSet['ConceptId'];
CardConcepts.Append;
CardConcepts['CardId'] := CardId;
CardConcepts['CardMessageId'] := CardMessageId;
CardConcepts['ConceptId'] := ConceptId;
CardConcepts['Rank'] := 1;
CardConcepts['IsAmbigous'] := false;
CardConcepts['IsManual'] := true;
CardConcepts['Status'] := 1;
CardConcepts['SessionIdEnt'] := CurrUsr.SessionId;
CardConcepts['SessionId'] :=CurrUsr.SessionId ;
CardConcepts.Post;
Еще бы неплохо пробелы в [] ставить. А так очень хорошее форматирование.
А что, никак поприличнее на этом языке не записать?
Типа хотя бы
Типа хотя бы
CardConcepts := (
'CardID' = CardID,
(* ... *)
'SessionID' = CurrUsr.Session.ID,
);
CardConcepts.Post;
А паскаль - это вообще неправильный язык, и основная его неправильность - в отсутствии логичного стиля. Можно сколько угодно говорить про причины введения фигурных скобок в сях, но фигурные скобки гораздо круче бегин/ендов. Они в голову легче и незаметнее проникают. А в паскале не каждому енду соответствует бегин, более того, есть блочные конструкции в которых вообще нет ни того ни другого.
Даже в модуле-2 при всём как-бы паскальном синтаксисе сделали немножко изменений (каких именно - не помню после чего это всё стало логичней.
Менеджеры дельфей были сильно неправы, когда взяли базовый паскаль за основу, имхо.
Даже в модуле-2 при всём как-бы паскальном синтаксисе сделали немножко изменений (каких именно - не помню после чего это всё стало логичней.
Менеджеры дельфей были сильно неправы, когда взяли базовый паскаль за основу, имхо.
> Менеджеры дельфей были сильно неправы, когда взяли базовый паскаль за основу, имхо.
Какая разница? Разве C++Builder не такой же, но с фигурными скобками?
Какая разница? Разве C++Builder не такой же, но с фигурными скобками?
>Какая разница?
Между чем и чем?
Между чем и чем?
Какая разница, какой синтаксис в Дельфи, если ты можешь использовать Билдер?
меж билдером и дельфой - никакой - VCL.
Мы вообще-то тут о синтаксе и оформлении кода говорим. Это я так, намекаю.
возможно. я предпочитаю здесь пробелы не ставить.
А что ты думаешь про то, куда ставить фигурную скобку в С-подобных языках?
И ещё - нужны ли табуляции (типа везде для лесенки пользуем табы, только сетку выставляем не по 8, а кому как нравится)? Или вся лесенка должна быть на пробелах
А что ты думаешь про то, куда ставить фигурную скобку в С-подобных языках?
и
for(i=0;i<size;i++) {
if(i<size-1) B[i]=M[i+(i+1)*size];
A[i]=M[i+i*size];
}
второй код хоть и длиннее - зато нагляднее и имхо проще найти парные скобки.
for(i=0;i<size;i++)
{
if(i<size-1) B[i]=M[i+(i+1)*size];
A[i]=M[i+i*size];
}
И ещё - нужны ли табуляции (типа везде для лесенки пользуем табы, только сетку выставляем не по 8, а кому как нравится)? Или вся лесенка должна быть на пробелах
Зато грамматика у него контекстно-свободная.
И сам язык гораздо правильнее, чем С. хотя бы тем, что в нём можно жить без указателей.
А про фигурные скобки и бегин-энды это ваще полный бред - при скорости набивания среднего программиста это не является определяющим фактором.
Так что прекратим холивар.
И сам язык гораздо правильнее, чем С. хотя бы тем, что в нём можно жить без указателей.
А про фигурные скобки и бегин-энды это ваще полный бред - при скорости набивания среднего программиста это не является определяющим фактором.
Так что прекратим холивар.
Про фиг.скобки не сюда. На пробелах.
Конечно, есть. Если предположить, что A имеет A.B, A.C, A.D
Но в данном случае with был использован констркуцией выше, и ещё раз выше. тут был бы третий вложенный with - не хотелось бы вносить путаницы.
with A do
begin
B:=...
C:=...
D:=..
end;
Вот тебе пример моего кода. Я предпочитаю табы, по 4 пробела кадый.
/***************************************************************************
* *
* begin : Fri Jan 7 23:13:54 2005 *
* copyright : (C) 2004 by Samokhvalov Anton <mail.ru> *
* *
***************************************************************************/
#include <Master.h>
#include <sched.h>
#include "Job.h"
#include "Storage.h"
#include "Debug.h"
class Exit: public IRun
{
public:
Exit( Storage* s ):
d_s( s )
{
}
override void run throw
{
try
{
d_s->cleanup;
}
catch ( const std::exception& e )
{
Debug::write( 3, "%s\n", e.what );
}
catch ( const Exception& e )
{
Debug::write( 3, "%s: %s\n", e.type e.description );
}
exit( 0 );
}
protected:
virtual ~Exit throw
{
}
private:
Storage* d_s;
};
Job::Job( Storage* s, const std::string& url, size_t first )
throw ( std::exception ):
d_storage( s
d_url( url
d_first( first )
{
}
Job::~Job throw
{
}
void Job::run throw
{
Debug::write( 1, "url %s started\n", d_url.c_str );
size_t current_brick = d_first;
char buf[ BlockFile::blockSize ];
while ( true )
{
std::auto_ptr<Master> master( new Master );
try
{
master.get->open( d_url );
if ( master.get->size != d_storage->getSize )
{
Debug::write( 1, "url %s points to file with different size\n",
d_url.c_str );
d_storage->setBadUrl( d_url.c_str );
return;
}
master.get->seek( off_t)current_brick)*BlockFile::blockSize );
while ( true )
{
const size_t readed = master.get->read(
buf, d_storage->brickSize( current_brick ) );
//indicates that we are not locked
//storage->touch;
d_storage->writeBrick( current_brick, buf );
try
{
size_t last = current_brick;
current_brick = d_storage->requestBrick( current_brick );
if ( current_brick != last + 1 )
{
master.get->seek( off_t)current_brick)*BlockFile::blockSize );
}
}
catch ( AllDone )
{
try
{
d_storage->cleanup;
}
catch ( const std::exception& e )
{
Debug::write( 3, "%s\n", e.what );
}
catch ( const Exception& e )
{
Debug::write( 3, "%s: %s\n", e.type e.description );
}
exit( 0 );
}
sched_yield;
}
}
catch ( const MasterException& me )
{
switch ( me.getError )
{
case Slave::None:
case Slave::ConnectionBroken:
case Slave::CannotConnect:
sleep( 1 );
break;
case Slave::BrokenUrl:
Debug::write( 1, "url %s broken\n", d_url.c_str );
d_storage->setBadUrl( d_url.c_str );
return;
default:
Debug::write( 3, "%s\n", me.getErrorDescription );
return;
}
}
catch ( const Exception& e )
{
Debug::write( 3, "%s: %s\n", e.type e.description );
return;
}
}
}
> Зато грамматика у него контекстно-свободная.
Сам-то понял что сказал?
> И сам язык гораздо правильнее, чем С. хотя бы тем, что в нём можно жить без указателей
В жаве и шарпе тоже. Мы о синтаксисе.
>при скорости набивания
Мы не о скорости набивания, а о скорости чтения.
>Так что прекратим холивар
Ок, прекращай. =)
Сам-то понял что сказал?
> И сам язык гораздо правильнее, чем С. хотя бы тем, что в нём можно жить без указателей
В жаве и шарпе тоже. Мы о синтаксисе.
>при скорости набивания
Мы не о скорости набивания, а о скорости чтения.
>Так что прекратим холивар
Ок, прекращай. =)
> > Зато грамматика у него контекстно-свободная.
> Сам-то понял что сказал?
Ты бы хоть по Яndex-у пробил незнакомый термин, прежде чем наезжать.
http://en.wikipedia.org/wiki/Context-free_grammar
> Сам-то понял что сказал?
Ты бы хоть по Яndex-у пробил незнакомый термин, прежде чем наезжать.
http://en.wikipedia.org/wiki/Context-free_grammar
> Если предположить, что A имеет A.B, A.C, A.D
А если A имеет A['x1'], A['x2'], ... , как в твоём примере?
А если A имеет A['x1'], A['x2'], ... , как в твоём примере?
А паскаль - это вообще неправильный язык, и основная его неправильность - в отсутствии логичного стиля.Описание синтаксиса компонентного паскаля (это который появился после Оберона-2) в EBNF умещается на одну страницу. "Логичный стиль" там продуман очень хорошо. Синтаксис обычного паскаля не очень сильно от него отличается.
2 :
> И сам язык гораздо правильнее, чем С. хотя бы тем,
> что в нём можно жить без указателей
Половина моей любви к Си - указатели.
2:
> TTT*BBB
Простите, башку оторвать кодеру за такие имена.
> Кстати, скорость чтения/понимания в паскале выше. именно,
> из-за begin/end, then, var, type и т.п.
Это довод типа "ничто". В сях никаких проблем по пониманию { } и объявлений переменных.
> И сам язык гораздо правильнее, чем С. хотя бы тем,
> что в нём можно жить без указателей
Половина моей любви к Си - указатели.
2:
> TTT*BBB
Простите, башку оторвать кодеру за такие имена.
> Кстати, скорость чтения/понимания в паскале выше. именно,
> из-за begin/end, then, var, type и т.п.
Это довод типа "ничто". В сях никаких проблем по пониманию { } и объявлений переменных.
Большая часть неуловимых ошибок типа AV/SF - из-за неправильной работы с указателями. при этом самая большая неприятность здесь заключается в том, что допустив ошибку в одном месте, она проявляется в другом. И достать почти невозможно. Особенно в больших проектах.
Немного оффтоп:
Сказать, почему я не засчитал одному студенту такую программу:
Немного оффтоп:
Сказать, почему я не засчитал одному студенту такую программу:
?
char c;
FILE *fp=fopen("a.dat","r");
int mas[256];
while(!feof(fp
{
ch=fgetc(fp);
mas[ch]++;
}
немного ответ на оффтоп:
Этот гад fclose забыл!
Этот гад fclose забыл!
a.c
Угадай, что она напечатает? без компилятора!
#include <stdio.h>
int main
{
char ch;
FILE *fp=fopen("a.c","r");
int mas[256];
int x=100;
while(!feof(fp
{
ch=fgetc(fp);
mas[ch]++;
}
fclose(fp);
printf("%d\n",x);
return 0;
}
По типу &x == mas-1 ?
да-да
И это очень печально. никакие range-check здесь не спасают
И это очень печально. никакие range-check здесь не спасают
Ясен пень, что - хренов кусок текста из файла.
Прогу надо пропатчить инструкцией после цикла: mas=&x+..;
Но вообще такой поход к делу - это лол. Печальный лол.
Прогу надо пропатчить инструкцией после цикла: mas=&x+..;
Но вообще такой поход к делу - это лол. Печальный лол.
Так в чем проблема? А то не все на С прогают?
"такой" - это какой?
например, за
например, за
сразу незачот - ибо fgetc возвращает int, и сравнивать ch на EOF смысла нет - он завалится на 'Ъ' в koi8 и 'я' в win1251.
char ch;
...
ch=fgetc(fp);
Это неочевидно даже с компилятором. Слишком это системнозависимо. Зависит от того как растет стек и как в нем располагаются данные. Минимум что требуется - ассемблерный вывод.
PS: хотя могу предположить что портится переменная х. И кстати как она портится - зависит от LE/BE. Могу предположить что на моей машине будет 101
PS: хотя могу предположить что портится переменная х. И кстати как она портится - зависит от LE/BE. Могу предположить что на моей машине будет 101

проблема в том, что напечатается 101. и хрен поймёшь, где х изменился.
а изменился он тут:
это здесь всего три строчки, где стоит ловить, когда не в свою память залезли. А если проект на 100К строк?
а изменился он тут:
mas[-1] по адресу совпадает с x
ch=fgetc(fp);
mas[ch]++; // ch==-1 когда достигнут конец файла
это здесь всего три строчки, где стоит ловить, когда не в свою память залезли. А если проект на 100К строк?
проверено на gcc (в классах на ММ 13-15, 13-16, 13-07, 13-08, v3.4) и MSVC 6.0 (cl v12.00.8168)
char знаковый?
по умолчанию - да
в одном из пред. постов я написал, что char использовать в данном случае вообще некорректно. поэтому int картины не меняет
в одном из пред. постов я написал, что char использовать в данном случае вообще некорректно. поэтому int картины не меняет
т.е. fgetc может возвращать отрицательные числа или большие 255?
Сразу заботиться об этом надо.
You shouldn't make mistakes anyway, it is a waste of time.
man fgetc
вот что говорит MSDN:
вот что говорит MSDN:
fgetc and _fgetchar return the character read as an int or return EOF to indicate an error or end of file. fgetwc and _fgetwchar return, as a wint_t, the wide character that corresponds to the character read or return WEOF to indicate an error or end of file. For all four functions, use feof or ferror to distinguish between an error and an end-of-file condition. For fgetc and fgetwc, if a read error occurs, the error indicator for the stream is set.EOF в char не помещается. следовательно - он где-то за пределами. Где именно - зависит от реализации.
Объясни, в чём дело, пожалуйста. Я уж и BC31 достал из детских запасов, и разные файлы проверял - всё время пишет 100.
не повезло 

Многие (ну и понятно я) используют следующий принцип. При вызове функции пробел не ставится, при использовании встроенного оператора ставится. То есть
Ой я вообще про пробел в другом месте, тут же тред про

но
f(x);
Это позволяет визуально отличить одно от другого. 70 постов я не осилил, так что извиняйте, может это уже было.
if (x)
...
while (x)
...
Ой я вообще про пробел в другом месте, тут же тред про пробел после скобкиНу ладно, набрал уже, жалко выбрасывать

А что, ничего приличнее BC31 не нашлось? Под дос очень модно на ваткоме было писать - DOS4GW, 32 битная арифметика, вся память, быстро, просто надёжно..
Что нашёл, то и взял. Я вообще-то хотел Turbo C 2.0, но чего нет, того нет.
А в чём ошибка всё-таки?
А в чём ошибка всё-таки?
Незачот.
Любой уважающий себя экзаменатор даже после незачёта скажет, какой ответ правильный и почему.
Ошибки объяснены постами выше
1) использовать char ch; ch=fgetc; некорректно
2) опрометчивый цикл
4) чтобы доказать неправильность этого куска мне пришлось ввести доп. переменную (х которая "ни с того, ни с сего" меняет значение. почему не работает с ВС31 - хз. я сейчас посмотрел ассемблеровский вывод и нихрена в нём не понял - gcc выдаёт более понятный асм. к тому же ВС почему-то у меня сильно тормозит машину.. фтопку этот компилятор.
надо иметь в виду, что sizeof(int)=2
1) использовать char ch; ch=fgetc; некорректно
2) опрометчивый цикл
3) У студента был довод "Ну ведь работает же!" - на что мне пришлось доказывать, что не работает.
while(!feof(fp
{
ch=fgetc(fp);
//Здесь должна быть проверка на конец файла
mas[ch]++; // из-за отсутствия предыдущей проверки здесь может произойти mas[-1]++;
}
4) чтобы доказать неправильность этого куска мне пришлось ввести доп. переменную (х которая "ни с того, ни с сего" меняет значение. почему не работает с ВС31 - хз. я сейчас посмотрел ассемблеровский вывод и нихрена в нём не понял - gcc выдаёт более понятный асм. к тому же ВС почему-то у меня сильно тормозит машину.. фтопку этот компилятор.
надо иметь в виду, что sizeof(int)=2
вот фрагмент:
#include <stdio.h>
int main
{
int ch;
FILE *fp=fopen("a.c","r");
int mas[256];
int x=100;
while(!feof(fp
{
ch=fgetc(fp);
mas[ch]++;
}
printf("%d\n",x);
return 0;
}
;
; int mas[256];
; int x=100;
;
?debug L 8
mov word ptr [bp-8],100
jmp short @86
@58:
;
; while(!feof(fp
; {
; ch=fgetc(fp);
;
?debug L 11
push word ptr [bp-4]
push word ptr [bp-6]
call near ptr _fgetc
pop cx
pop cx
mov word ptr [bp-2],ax
;
; mas[ch]++;
;
?debug L 12
mov bx,word ptr [bp-2]
shl bx,1
lea ax,word ptr [bp-520]
add bx,ax
inc word ptr ss:[bx]
@86:
?debug L 9
les bx,dword ptr [bp-6]
test word ptr es:[bx+2],32
je short @58
ААААААААА!..... А я-то уж думал, совсем тупой стал
Выходит, у меня в винде никто нолик в конце текстового файла просто не ставит, ибо нафиг?
Выходит, у меня в винде никто нолик в конце текстового файла просто не ставит, ибо нафиг?
D:\Bc31\A.C DOS 231 Col 0 100%
0000000000: 23 69 6E 63 6C 75 64 65 │ 20 3C 73 74 64 69 6F 2E #include <stdio.
0000000010: 68 3E 0D 0A 0D 0A 69 6E │ 74 20 6D 61 69 6E 28 29 h>♪◙♪◙int main
0000000020: 0D 0A 7B 0D 0A 09 63 68 │ 61 72 20 63 68 3B 0D 0A ♪◙{♪◙○char ch;♪◙
0000000030: 09 46 49 4C 45 2A 20 66 │ 70 20 3D 20 66 6F 70 65 ○FILE* fp = fope
0000000040: 6E 28 22 61 2E 63 22 2C │ 20 22 72 22 29 3B 0D 0A n("a.c", "r");♪◙
0000000050: 09 69 6E 74 20 6D 61 73 │ 5B 32 35 36 5D 3B 0D 0A ○int mas[256];♪◙
0000000060: 09 69 6E 74 20 78 20 3D │ 20 31 30 30 3B 0D 0A 0D ○int x = 100;♪◙♪
0000000070: 0A 09 77 68 69 6C 65 20 │ 28 21 66 65 6F 66 28 66 ◙○while (!feof(f
0000000080: 70 29 29 0D 0A 09 7B 0D │ 0A 09 09 63 68 20 3D 20 p♪◙○{♪◙○○ch =
0000000090: 66 67 65 74 63 28 66 70 │ 29 3B 0D 0A 09 09 6D 61 fgetc(fp);♪◙○○ma
00000000A0: 73 5B 63 68 5D 2B 2B 3B │ 0D 0A 09 7D 0D 0A 0D 0A s[ch]++;♪◙○}♪◙♪◙
00000000B0: 09 66 63 6C 6F 73 65 28 │ 66 70 29 3B 0D 0A 0D 0A ○fclose(fp);♪◙♪◙
00000000C0: 0D 0A 0D 0A 09 70 72 69 │ 6E 74 66 28 22 25 64 5C ♪◙♪◙○printf("%d\
00000000D0: 6E 22 2C 78 29 3B 0D 0A │ 09 72 65 74 75 72 6E 20 n",x);♪◙○return
00000000E0: 30 3B 0D 0A 7D 0D 0A │ 0;♪◙}♪◙
1Help 2Unwrap 3Quit 4Text 5 6Edit 7Search 8Win 9 10Quit
Ахтунг! Текстовый скриншот винды!
Где-то я слышал, что в MySQL AB code style принят такой: a= b (после a пробела нет). Они говорят, что так борются с какими-то ошибками-опечатками.
что за новые веения в асме?
после мнемоники должен быть таб - иначе это ересь, а не асм
после мнемоники должен быть таб - иначе это ересь, а не асм

> ошибок типа AV/SF
Ачтойта? Я только schroedinbug, Bohr bug, mandelbug и heisenbug знаю...
Да, пойнтеры могут привести к Последствиям. Поэтому я и прогаю на шарпе.
С другой стороны язык в котором нет массивов, строк и прочей высокоуровневой фигни на уровне синтаксиса чем-то прекрасен. Ортогонален и всё такое.
Именно поэтому за использование char * (вместо string или другой настоящей строки) в якобы высокоуровневой проге надо сразу стрелять на месте, и любые рассуждения на тему более или менее безопасного их использования это бред сивой кобылы. ИМХО. Да, а преподавателей, которые не считают нужным (или сами не знают) разъяснить обучаемым, что char * это НЕ строка, неплохо бы за что-нибудь подвешивать =)
А вообще на сях нужно писать драйвера и прочие тайм-критикал куски кода. Для остального лучше использовать другие языки с прекрасным С-шным синтаксисом - жаву или шарп.
Ачтойта? Я только schroedinbug, Bohr bug, mandelbug и heisenbug знаю...
Да, пойнтеры могут привести к Последствиям. Поэтому я и прогаю на шарпе.
С другой стороны язык в котором нет массивов, строк и прочей высокоуровневой фигни на уровне синтаксиса чем-то прекрасен. Ортогонален и всё такое.
Именно поэтому за использование char * (вместо string или другой настоящей строки) в якобы высокоуровневой проге надо сразу стрелять на месте, и любые рассуждения на тему более или менее безопасного их использования это бред сивой кобылы. ИМХО. Да, а преподавателей, которые не считают нужным (или сами не знают) разъяснить обучаемым, что char * это НЕ строка, неплохо бы за что-нибудь подвешивать =)
А вообще на сях нужно писать драйвера и прочие тайм-критикал куски кода. Для остального лучше использовать другие языки с прекрасным С-шным синтаксисом - жаву или шарп.
А по поводу представленной проги я вообще смеялся.
char вообще-то signed, поэтому _любой_ символ с кодом выше 127 (например русская буква) пролетит мимо массива =) Студентам С преподаешь, да? Мило, мило.
char вообще-то signed, поэтому _любой_ символ с кодом выше 127 (например русская буква) пролетит мимо массива =) Студентам С преподаешь, да? Мило, мило.
Драйвера, IMHO, лучше присать на С++ -- можно какой-нибудь фреймворк замутить, там много однотипного. Ядро еще можно, там разницы нет никакой, в первую очередь думают, потом пишут, главное прозрачность и читабельность, что б не надо было по темплейтам прыгать аля STL. Всякию другою хрень, вроде численых методов и проч., лучше тоже на С++.
> char вообще-то signed
совсем не обязательно
совсем не обязательно
Да. Но как правило всё-таки signed.
Access Violation / Segmentation fault.
Ещё раз, char ch - там некорректен! правильно писать int ch. за это первый незачОт, ибо - хрен с ними, с русскими символами. а вот если будет буква 0xFF, которая в некоторых кодировках очень даже нормальная, то при сравнении char, который 0xFF (signed) с EOF получится истина.
второй незачот выделен красным.
Да, и чем же char * НЕ строка? Или ты знаешь в С другой способ оперировать с текстовыми строками?
// про асм - это выдача BC31
Ещё раз, char ch - там некорректен! правильно писать int ch. за это первый незачОт, ибо - хрен с ними, с русскими символами. а вот если будет буква 0xFF, которая в некоторых кодировках очень даже нормальная, то при сравнении char, который 0xFF (signed) с EOF получится истина.
второй незачот выделен красным.
Да, и чем же char * НЕ строка? Или ты знаешь в С другой способ оперировать с текстовыми строками?
// про асм - это выдача BC31
а вот мой пример, я считаю, что пробел после скобки не нужен:
AmountMST postPennyDiff(DiscAmount _mSTDiffCur,
AmountMST _mSTDiffMST,
Amount _exchRate,
CustVendTrans _custVendTrans,
TaxAmount _taxAmount = 0)
{
LedgerAccount pageAccount;
TaxAmount taxSettled;
// EGLA, Correspondence II -->
LedgerBondClient_RU ledgerBondClient;
LedgerBondVRefId_RU sumAccountVRefId;
// EGLA, Correspondence II <--
CustVendTrans mSTDiffTrans = _custVendTrans.data;
;
postingProfile = _custVendTrans.postingProfile;
mSTDiffTrans.clear;
mSTDiffTrans.accountNum = _custVendTrans.accountNum;
mSTDiffTrans.transDate = transactionDate;
mSTDiffTrans.voucher = ledgerVoucher.lastVoucher;
mSTDiffTrans.approved = NoYes::Yes;
mSTDiffTrans.txt = transactionTxt.txt;
mSTDiffTrans.closed = mSTDiffTrans.maxSettlementDate(transactionDate);
mSTDiffTrans.currencyCode = _custVendTrans.currencyCode;
mSTDiffTrans.amountCur = _mSTDiffCur;
mSTDiffTrans.amountMST = _mSTDiffMST;
mSTDiffTrans.settleAmountCur = mSTDiffTrans.amountCur;
mSTDiffTrans.settleAmountMST = mSTDiffTrans.amountMST;
mSTDiffTrans.lastSettleVoucher = _custVendTrans.voucher;
mSTDiffTrans.lastSettleDate = transactionDate;
mSTDiffTrans.closed = transactionDate;
mSTDiffTrans.dimension = _custVendTrans.dimension;
//Valu -->
mSTDiffTrans.RcontractCode = _custVendTrans.RcontractCode;
mSTDiffTrans.RContractAccount = _custVendTrans.RContractAccount;
//Valu <--
mSTDiffTrans.initFromPostingProfile(postingProfile);
this.reverseAmounts(mSTDiffTrans);
mSTDiffTrans.insert;
this.createLedgerVoucherTrans(_custVendTrans,this.mstDiffTxtLedger;
//Valu -->
ledgerBondClient = ledgerVoucher.findLedgerVoucherObject.ledgerBondClient_RU;
if (ledgerBondClient.currentLogLength== 0)
{
_taxAmount = 0;
}
ledgerVoucher.addTrans(
LedgerVoucherTransObject::newCreateTrans(
ledgerVoucher.findLedgerVoucherObject
LedgerPostingType::MSTDiff,
mSTDiffTrans.sumAccount
_custVendTrans.dimension,
companyInfo::standardCurrency
mSTDiffTrans.amountMST,
mSTDiffTrans.recId;
// EGLA, Correspondence II -->
if (ledgerBondClient)
{
sumAccountVRefId = ledgerBondClient.lastVRefId;
}
// EGLA, Correspondence II <--
if (abs(_mSTDiffMST) <= this.maxMSTDiff
{
pageAccount = LedgerSystemAccounts::accountNum(LedgerPostingType::MSTDiff);
}
else
{
pageAccount = this.cashDiscAccount(_custVendTrans);
if (!pageAccount)
{
switch (_custVendTrans.tableId)
{
case tableNum(CustTrans):
throw error(strFmt("@SYS24816",LedgerPostingType::CustCashDisc;
case tableNum(VendTrans):
throw error(strFmt("@SYS24816",LedgerPostingType::VendCashDisc;
}
}
}
if (_taxAmount < 0)
{
if (_taxAmount < -mSTDiffTrans.amountMST)
{
taxSettled = -mSTDiffTrans.amountMST;
}
else
{
taxSettled = _taxAmount;
}
}
else
{
if (_taxAmount > 0)
{
if (_taxAmount > -mSTDiffTrans.amountMST)
{
taxSettled = -mSTDiffTrans.amountMST;
}
else
{
taxSettled = _taxAmount;
}
}
}
if (mSTDiffTrans.amountMST + taxSettled)
{
if (abs(_mSTDiffMST) <= this.maxMSTDiff
{
ledgerVoucher.addTrans(
LedgerVoucherTransObject::newCreateTrans(
ledgerVoucher.findLedgerVoucherObject
LedgerPostingType::MSTDiff,
pageAccount,
_custVendTrans.dimension,
companyInfo::standardCurrency
-(mSTDiffTrans.amountMST + taxSettled
mSTDiffTrans.recId;
}
else
{
this.postPennyDiffOnCashDiscmSTDiffTrans.amountMST + taxSettled
_custVendTrans,
(_custVendTrans.amountMST * 100/ _custVendTrans.amountCur
custVendTransCredit);
}
}
// EGLA, Correspondence II -->
if (ledgerBondClient)
{
ledgerBondClient.bondVRef2Log(sumAccountVRefId);
ledgerBondClient.removeCurrentLogObject;
}
// EGLA, Correspondence II <--
if (ledgerVoucherCreated)
{
ledgerVoucher.end;
}
//Valu -->
this.createPostingTransLog_RU(CustVendTransPostingLogType_RU::PennyDifference,
mSTDiffTrans,
LedgerPostingType::MSTDiff,
mSTDiffTrans.sumAccount
pageAccount,
mSTDiffTrans.AmountMST,
0,
0,
mSTDiffTrans.dimension,
mSTDiffTrans.AmountCur,
_custVendTrans,
custVendTransCredit);
//Valu <--
return taxSettled;
}
скобки как бы объединяют в одно то, что внутри них, и представляют это как отдельный аргумент, поэтому они должны стоять ближе к внутренностям
и еще пробелами отделяться должны мелкие знаки типа +, =, чтобы было лучше видно аргументы этих операций
насчет пробела после названия функции - я обычно не ставлю, кроме if и for...
и еще пробелами отделяться должны мелкие знаки типа +, =, чтобы было лучше видно аргументы этих операций
насчет пробела после названия функции - я обычно не ставлю, кроме if и for...
мне интересно, есть какой-нибудь стандарт форматирования кода, для c++/c# или java? где на него посмотреть можно..
Для java в idea есть возможность переформатирования кода + есть некоторые настройки.
Наверное к этому должна быть документация...
Наверное к этому должна быть документация...
> Где-то я слышал, что в MySQL AB code style принят такой: a= b (после a пробела нет).
Еще от ошибок защищает установка константы слева от сравнения. Типа if (0 == var). Но так никто не делает, наверное потому, что некрасиво.
Еще от ошибок защищает установка константы слева от сравнения. Типа if (0 == var). Но так никто не делает, наверное потому, что некрасиво.
Ещё от ошибок защищает правильная семантика знака "=".
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
>Да, и чем же char * НЕ строка?
char * - это указатель на char. Строка это то, для чего определена операция конкатенации.
>Или ты знаешь в С другой способ оперировать с текстовыми строками?
string (в С++) или свой враппер. Поскольку в С объектов нету, то враппер будет не вполне объектом на вид, но это неважно.
Да, массивов, кстати, в С тоже почти нету, нельзя же серьёзно считать запись 3[a] обращением к элементу массива, поэтому для массивов тоже нужно писать врапперы - с range checking и всё такое. ИМХО к программированию на С/С++ именно так нужно подходить, а все эти страшные ашибки как раз и возникают от того, что люди почему-то считают char * строкой и упорно не хотят терять немножко скорости на range checking в самописном array. Ну ладно, в критическом по скорости месте можно писать хоть на асме, но в прогах-то как правило 90% и больше - это управляющий, а не вычисляющий код, кому там скорость критична.
А если пойти ещё дальше, то придёшь к шарпу =)
char * - это указатель на char. Строка это то, для чего определена операция конкатенации.
>Или ты знаешь в С другой способ оперировать с текстовыми строками?
string (в С++) или свой враппер. Поскольку в С объектов нету, то враппер будет не вполне объектом на вид, но это неважно.
Да, массивов, кстати, в С тоже почти нету, нельзя же серьёзно считать запись 3[a] обращением к элементу массива, поэтому для массивов тоже нужно писать врапперы - с range checking и всё такое. ИМХО к программированию на С/С++ именно так нужно подходить, а все эти страшные ашибки как раз и возникают от того, что люди почему-то считают char * строкой и упорно не хотят терять немножко скорости на range checking в самописном array. Ну ладно, в критическом по скорости месте можно писать хоть на асме, но в прогах-то как правило 90% и больше - это управляющий, а не вычисляющий код, кому там скорость критична.
А если пойти ещё дальше, то придёшь к шарпу =)
Маза скобками это не исправить. 

>Еще от ошибок защищает установка константы слева от сравнения. Типа if (0 == var).
>Но так никто не делает, наверное потому, что некрасиво
if (NULL == myVar) - красиво, я так делаю, M$ в dxSdk везде так делает.
>мне интересно, есть какой-нибудь стандарт форматирования кода, для c++/c# или java? где на него посмотреть можно..
я ссылку на рсдн давал.
>Но так никто не делает, наверное потому, что некрасиво
if (NULL == myVar) - красиво, я так делаю, M$ в dxSdk везде так делает.
>мне интересно, есть какой-нибудь стандарт форматирования кода, для c++/c# или java? где на него посмотреть можно..
я ссылку на рсдн давал.
> char вообще-то signedНе знаю что там по стандарту, а и в студии и в g++ ситуация вот такая
совсем не обязательно
#include <iostream>
void f(char c)
{
std::cout << "char" << std::endl;
}
void f(signed char c)
{
std::cout << "signed char" << std::endl;
}
void f(unsigned char c)
{
std::cout << "unsigned char" << std::endl;
}
int main
{
fchar)0);
fsigned char)0);
funsigned char)0);
}
[xenon andrei]$ ./charТак что char - это просто char, странно что для него вообще < > определены. По хорошему надо было только == оставить.
char
signed char
unsigned char
В догонку:

B. Eckel, "Thinking in Java":
The value of standardization is that it takes less brain cycles to parse the code, so that you can focus more on what the code means.

Весь тред не осилил.
Но точно знаю, что есть рекомендации Microsoft по форматированию кода для своих программистов. Наверное, можно им следовать.
Думаю. что и для разных других языков, которые этот документ не затрагивает, можно найти классическую книжку и посмотреть, как они там код форматируют.
Но точно знаю, что есть рекомендации Microsoft по форматированию кода для своих программистов. Наверное, можно им следовать.
Думаю. что и для разных других языков, которые этот документ не затрагивает, можно найти классическую книжку и посмотреть, как они там код форматируют.
> Не знаю что там по стандарту
The three types char, signed char, and unsigned char
are collectively called the character types. The
implementation shall define char to have the same range,
representation, and behavior as either signed char or
unsigned char.*)
*) CHAR_MIN, defined in <limits.h>, will have one of the
values 0 or SCHAR_MIN, and this can be used to
distinguish the two options. Irrespective of the choice
made, char is a separate type from the other two and is
not compatible with either.
если речь идет о джаве, то можно положиться на коды примеров из tutorial. в си(++ я полагаю, можно пользоваться той же договоренностью. в любом случае just keep it readable!
and "just keep it simple, stupid!" 

sure. no doubts. but that's too general for the thread. i preferred to be a bit more specific.
в нем нет ничего про пробел после открывающей скобки 

>я ссылку на рсдн давал
а можешь еще раз эту ссылку привести?
а можешь еще раз эту ссылку привести?
я нашел только эту: http://www.rsdn.ru/article/mag/200401/codestyle.XML
но там тоже нет ничего про пробел после скобки :-(
но там тоже нет ничего про пробел после скобки :-(
Оставить комментарий
otvertka07
я сам не ставю, но вот один программер в нашей конторе ставит, и меня это раздражает, я его код не могу читать