Ставите ли вы пробел после скобки?

otvertka07

я сам не ставю, но вот один программер в нашей конторе ставит, и меня это раздражает, я его код не могу читать

lera98

забань его.

Vladislav177Rus

Удаляй весь его код отовсюду, откуда увидишь

qwertyuiop19771

клева!

yolki

Есть у нас один, вокруг "присваивания" всегда пробелы ставит - говорит, лучше видно..

bastii

Так что ли?
x = 0
Так ведь лучше читается.
А вот так уже извратно:
doSmth( param1, param2 )
или
for ( i = 0; i < n; i++ ) ...

sergey_m

> Есть у нас один, вокруг "присваивания" всегда пробелы ставит - говорит, лучше видно..
Типа вы его лошите за это, так?

Julie16

Правильно говорит. Чем больше пространства - тем лучше. В разумных пределах, конечно.

Julie16

Между прочим то что ты назвал извратным - очень удобно.

bastii

Может быть, просто считаю, что особой читабельности эти пробелы не добавляют, но при этом нужно лишний раз пробелится, и в связи с этим появляется лишний источник ошибок. Лично я часто либо пробел пропускаю, либо путаю местами с переменной, если она длиной в один символ

Julie16

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

Valerik62

у вас там контора джавистов-любителей?

bleyman

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

bastii

Мдя
Потом, должна спасать подсветка.

Julie16

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

Valerik62

это не тру

bleyman

+ - это крестик.

Julie16

+ - это сложение. Эти эффекты, знаешь ли, складываются.

Valerik62

разноцветное с пробелами утомляет сильнее чем что-нибудь одно

lera98

Я ваще в ауте от темы
Давайте для мозга дривер токенизации заинсталлим? Тада мозгу будет пох, если вся прога через точку-с-запятой в одну строку записана будет!
ае

bleyman

А!
Видишь ли, помимо повышения наглядности токенизации у системы оформления кода есть ещё несколько целей. Например, облегчение восприятия логической структуры. Использовать дополнительные пробелы и там и там невозможно, а твой + на самом деле является оператором | (вот, кстати, пример неудачного оверлоада так что пробелы после скобочек это бесполезная трата возможностей устройства вывода.

if (a + (b * d) < 0) // right
if ( a + ( b * d ) < 0 ) // wrong

bleyman


if ( ( a + ( b * d ) ) < 0 ) // ваще пиздец wrong

lera98

Имхо, правильно говорит.
А учитывая фактор лени:
if(a+(b*d)<0)// left : )

Julie16

Я бы написал так:

if ( a + (b * d) < 0 )

Я же не говорю что пробелы надо ставить везде. Пробела перед второй скобкой и после третьей скобки вполне достаточно для изложенной мной цели.

lera98

Реально после if и т.п никогда пробел не ставлю.

enochka1145

> Если не ставить пробелы, то мозгу приходется делать токенизацию этой каши на составляющие
Фигня. Ограниченность зрения - вещь куда более серьёзная. Если строчка длинная (из-за пробелов, в частности то глазу при чтении нужно делать больше остановок. Не все владеют техникой быстрого чтения и накаченной мышцей периферического зрения.
Ведь не пишут y = f( x )

enochka1145

> Реально после if и т.п никогда пробел не ставлю.
А вот за это готов душить собственными руками. if и for всё-таки не функции.

Julie16

Я так пишу.

lera98

Заходи и души, я не против. Пробелы всё равно ставить не буду.

enochka1145

Я имею в виду на бумаге.

lera98

Какая нафиг токенизация... Проблема пробелов в коде - это фигня по сравнению с проблемой почерка врачей.

yolki

типа так:

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;

Если учесть, что двоеточие в паскале в блоке не встречается больше нигде и явно бросается в глаза - считаю пробелы излишними.

Julie16

Еще бы неплохо пробелы в [] ставить. А так очень хорошее форматирование.

Marinavo_0507

А что, никак поприличнее на этом языке не записать?
Типа хотя бы

CardConcepts := (
'CardID' = CardID,
(* ... *)
'SessionID' = CurrUsr.Session.ID,
);
CardConcepts.Post;

bleyman

А паскаль - это вообще неправильный язык, и основная его неправильность - в отсутствии логичного стиля. Можно сколько угодно говорить про причины введения фигурных скобок в сях, но фигурные скобки гораздо круче бегин/ендов. Они в голову легче и незаметнее проникают. А в паскале не каждому енду соответствует бегин, более того, есть блочные конструкции в которых вообще нет ни того ни другого.
Даже в модуле-2 при всём как-бы паскальном синтаксисе сделали немножко изменений (каких именно - не помню после чего это всё стало логичней.
Менеджеры дельфей были сильно неправы, когда взяли базовый паскаль за основу, имхо.

Marinavo_0507

> Менеджеры дельфей были сильно неправы, когда взяли базовый паскаль за основу, имхо.
Какая разница? Разве C++Builder не такой же, но с фигурными скобками?

bleyman

>Какая разница?
Между чем и чем?

Marinavo_0507

Какая разница, какой синтаксис в Дельфи, если ты можешь использовать Билдер?

lera98

меж билдером и дельфой - никакой - VCL.

bleyman

Мы вообще-то тут о синтаксе и оформлении кода говорим. Это я так, намекаю.

yolki

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

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, а кому как нравится)? Или вся лесенка должна быть на пробелах

yolki

Зато грамматика у него контекстно-свободная.
И сам язык гораздо правильнее, чем С. хотя бы тем, что в нём можно жить без указателей.
А про фигурные скобки и бегин-энды это ваще полный бред - при скорости набивания среднего программиста это не является определяющим фактором.
Так что прекратим холивар.

lera98

Про фиг.скобки не сюда. На пробелах.

yolki

Конечно, есть. Если предположить, что A имеет A.B, A.C, A.D

with A do
begin
B:=...
C:=...
D:=..
end;
Но в данном случае with был использован констркуцией выше, и ещё раз выше. тут был бы третий вложенный with - не хотелось бы вносить путаницы.

Julie16

Вот тебе пример моего кода. Я предпочитаю табы, по 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;
}
}
}

bleyman

> Зато грамматика у него контекстно-свободная.
Сам-то понял что сказал?
> И сам язык гораздо правильнее, чем С. хотя бы тем, что в нём можно жить без указателей
В жаве и шарпе тоже. Мы о синтаксисе.
>при скорости набивания
Мы не о скорости набивания, а о скорости чтения.
>Так что прекратим холивар
Ок, прекращай. =)

enochka1145

> > Зато грамматика у него контекстно-свободная.
> Сам-то понял что сказал?
Ты бы хоть по Яndex-у пробил незнакомый термин, прежде чем наезжать.
http://en.wikipedia.org/wiki/Context-free_grammar

Marinavo_0507

> Если предположить, что A имеет A.B, A.C, A.D
А если A имеет A['x1'], A['x2'], ... , как в твоём примере?

garikus

А паскаль - это вообще неправильный язык, и основная его неправильность - в отсутствии логичного стиля.
Описание синтаксиса компонентного паскаля (это который появился после Оберона-2) в EBNF умещается на одну страницу. "Логичный стиль" там продуман очень хорошо. Синтаксис обычного паскаля не очень сильно от него отличается.

lera98

2 :
> И сам язык гораздо правильнее, чем С. хотя бы тем,
> что в нём можно жить без указателей
Половина моей любви к Си - указатели.
2:
> TTT*BBB
Простите, башку оторвать кодеру за такие имена.
> Кстати, скорость чтения/понимания в паскале выше. именно,
> из-за begin/end, then, var, type и т.п.
Это довод типа "ничто". В сях никаких проблем по пониманию { } и объявлений переменных.

yolki

Большая часть неуловимых ошибок типа AV/SF - из-за неправильной работы с указателями. при этом самая большая неприятность здесь заключается в том, что допустив ошибку в одном месте, она проявляется в другом. И достать почти невозможно. Особенно в больших проектах.
Немного оффтоп:
Сказать, почему я не засчитал одному студенту такую программу:

char c;
FILE *fp=fopen("a.dat","r");
int mas[256];
while(!feof(fp
{
ch=fgetc(fp);
mas[ch]++;
}
?

lera98

немного ответ на оффтоп:
Этот гад fclose забыл!

yolki

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;
}
Угадай, что она напечатает? без компилятора!

Marinavo_0507

По типу &x == mas-1 ?

yolki

да-да
И это очень печально. никакие range-check здесь не спасают

lera98

Ясен пень, что - хренов кусок текста из файла.
Прогу надо пропатчить инструкцией после цикла: mas=&x+..;
Но вообще такой поход к делу - это лол. Печальный лол.

bastii

Так в чем проблема? А то не все на С прогают?

yolki

"такой" - это какой?
например, за

char ch;
...
ch=fgetc(fp);
сразу незачот - ибо fgetc возвращает int, и сравнивать ch на EOF смысла нет - он завалится на 'Ъ' в koi8 и 'я' в win1251.

Julie16

Это неочевидно даже с компилятором. Слишком это системнозависимо. Зависит от того как растет стек и как в нем располагаются данные. Минимум что требуется - ассемблерный вывод.
PS: хотя могу предположить что портится переменная х. И кстати как она портится - зависит от LE/BE. Могу предположить что на моей машине будет 101

yolki

проблема в том, что напечатается 101. и хрен поймёшь, где х изменился.
а изменился он тут:

ch=fgetc(fp);
mas[ch]++; // ch==-1 когда достигнут конец файла
mas[-1] по адресу совпадает с x
это здесь всего три строчки, где стоит ловить, когда не в свою память залезли. А если проект на 100К строк?

yolki

проверено на gcc (в классах на ММ 13-15, 13-16, 13-07, 13-08, v3.4) и MSVC 6.0 (cl v12.00.8168)

bastii

char знаковый?

yolki

по умолчанию - да
в одном из пред. постов я написал, что char использовать в данном случае вообще некорректно. поэтому int картины не меняет

bastii

т.е. fgetc может возвращать отрицательные числа или большие 255?

lera98

Сразу заботиться об этом надо.

Marinavo_0507

You shouldn't make mistakes anyway, it is a waste of time.

yolki

man fgetc
вот что говорит 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 не помещается. следовательно - он где-то за пределами. Где именно - зависит от реализации.

enochka1145

Объясни, в чём дело, пожалуйста. Я уж и BC31 достал из детских запасов, и разные файлы проверял - всё время пишет 100.

bastii

не повезло

rosali

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

yolki

А что, ничего приличнее BC31 не нашлось? Под дос очень модно на ваткоме было писать - DOS4GW, 32 битная арифметика, вся память, быстро, просто надёжно..

enochka1145

Что нашёл, то и взял. Я вообще-то хотел Turbo C 2.0, но чего нет, того нет.
А в чём ошибка всё-таки?

Julie16

Незачот.

enochka1145

Любой уважающий себя экзаменатор даже после незачёта скажет, какой ответ правильный и почему.

yolki

Ошибки объяснены постами выше
1) использовать char ch; ch=fgetc; некорректно
2) опрометчивый цикл

while(!feof(fp
{
ch=fgetc(fp);
//Здесь должна быть проверка на конец файла
mas[ch]++; // из-за отсутствия предыдущей проверки здесь может произойти mas[-1]++;
}
3) У студента был довод "Ну ведь работает же!" - на что мне пришлось доказывать, что не работает.
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

enochka1145

ААААААААА!..... А я-то уж думал, совсем тупой стал
Выходит, у меня в винде никто нолик в конце текстового файла просто не ставит, ибо нафиг?
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

Marinavo_0507

Ахтунг! Текстовый скриншот винды!

TYU_2008

Где-то я слышал, что в MySQL AB code style принят такой: a= b (после a пробела нет). Они говорят, что так борются с какими-то ошибками-опечатками.

state7401281

что за новые веения в асме?
после мнемоники должен быть таб - иначе это ересь, а не асм

bleyman

> ошибок типа AV/SF
Ачтойта? Я только schroedinbug, Bohr bug, mandelbug и heisenbug знаю...
Да, пойнтеры могут привести к Последствиям. Поэтому я и прогаю на шарпе.
С другой стороны язык в котором нет массивов, строк и прочей высокоуровневой фигни на уровне синтаксиса чем-то прекрасен. Ортогонален и всё такое.
Именно поэтому за использование char * (вместо string или другой настоящей строки) в якобы высокоуровневой проге надо сразу стрелять на месте, и любые рассуждения на тему более или менее безопасного их использования это бред сивой кобылы. ИМХО. Да, а преподавателей, которые не считают нужным (или сами не знают) разъяснить обучаемым, что char * это НЕ строка, неплохо бы за что-нибудь подвешивать =)
А вообще на сях нужно писать драйвера и прочие тайм-критикал куски кода. Для остального лучше использовать другие языки с прекрасным С-шным синтаксисом - жаву или шарп.

bleyman

А по поводу представленной проги я вообще смеялся.
char вообще-то signed, поэтому _любой_ символ с кодом выше 127 (например русская буква) пролетит мимо массива =) Студентам С преподаешь, да? Мило, мило.

bastii

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

Chupa

> char вообще-то signed
совсем не обязательно

bleyman

Да. Но как правило всё-таки signed.

yolki

Access Violation / Segmentation fault.
Ещё раз, char ch - там некорректен! правильно писать int ch. за это первый незачОт, ибо - хрен с ними, с русскими символами. а вот если будет буква 0xFF, которая в некоторых кодировках очень даже нормальная, то при сравнении char, который 0xFF (signed) с EOF получится истина.
второй незачот выделен красным.
Да, и чем же char * НЕ строка? Или ты знаешь в С другой способ оперировать с текстовыми строками?
// про асм - это выдача BC31

otvertka07

а вот мой пример, я считаю, что пробел после скобки не нужен:
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;
}

otvertka07

скобки как бы объединяют в одно то, что внутри них, и представляют это как отдельный аргумент, поэтому они должны стоять ближе к внутренностям
и еще пробелами отделяться должны мелкие знаки типа +, =, чтобы было лучше видно аргументы этих операций
насчет пробела после названия функции - я обычно не ставлю, кроме if и for...

otvertka07

мне интересно, есть какой-нибудь стандарт форматирования кода, для c++/c# или java? где на него посмотреть можно..

durka82

Для java в idea есть возможность переформатирования кода + есть некоторые настройки.
Наверное к этому должна быть документация...

sergey_m

> Где-то я слышал, что в MySQL AB code style принят такой: a= b (после a пробела нет).
Еще от ошибок защищает установка константы слева от сравнения. Типа if (0 == var). Но так никто не делает, наверное потому, что некрасиво.

Ivan8209

Ещё от ошибок защищает правильная семантика знака "=".
---
...Я работаю антинаучным аферистом...

bleyman

>Да, и чем же char * НЕ строка?
char * - это указатель на char. Строка это то, для чего определена операция конкатенации.
>Или ты знаешь в С другой способ оперировать с текстовыми строками?
string (в С++) или свой враппер. Поскольку в С объектов нету, то враппер будет не вполне объектом на вид, но это неважно.
Да, массивов, кстати, в С тоже почти нету, нельзя же серьёзно считать запись 3[a] обращением к элементу массива, поэтому для массивов тоже нужно писать врапперы - с range checking и всё такое. ИМХО к программированию на С/С++ именно так нужно подходить, а все эти страшные ашибки как раз и возникают от того, что люди почему-то считают char * строкой и упорно не хотят терять немножко скорости на range checking в самописном array. Ну ладно, в критическом по скорости месте можно писать хоть на асме, но в прогах-то как правило 90% и больше - это управляющий, а не вычисляющий код, кому там скорость критична.
А если пойти ещё дальше, то придёшь к шарпу =)

Marinavo_0507

Маза скобками это не исправить.

bleyman

>Еще от ошибок защищает установка константы слева от сравнения. Типа if (0 == var).
>Но так никто не делает, наверное потому, что некрасиво
if (NULL == myVar) - красиво, я так делаю, M$ в dxSdk везде так делает.
>мне интересно, есть какой-нибудь стандарт форматирования кода, для c++/c# или java? где на него посмотреть можно..
я ссылку на рсдн давал.

rosali

> 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
signed char
unsigned char
Так что char - это просто char, странно что для него вообще < > определены. По хорошему надо было только == оставить.

enochka1145

В догонку:
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.

ruler

Весь тред не осилил.
Но точно знаю, что есть рекомендации Microsoft по форматированию кода для своих программистов. Наверное, можно им следовать.
Думаю. что и для разных других языков, которые этот документ не затрагивает, можно найти классическую книжку и посмотреть, как они там код форматируют.

Chupa

> Не знаю что там по стандарту
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.

maslyan

если речь идет о джаве, то можно положиться на коды примеров из tutorial. в си(++ я полагаю, можно пользоваться той же договоренностью. в любом случае just keep it readable!

garikus

and "just keep it simple, stupid!"

maslyan

sure. no doubts. but that's too general for the thread. i preferred to be a bit more specific.

otvertka07

в нем нет ничего про пробел после открывающей скобки

otvertka07

>я ссылку на рсдн давал
а можешь еще раз эту ссылку привести?

otvertka07

я нашел только эту: http://www.rsdn.ru/article/mag/200401/codestyle.XML
но там тоже нет ничего про пробел после скобки :-(
Оставить комментарий
Имя или ник:
Комментарий: