Russian Qt Forum

Программирование => С/C++ => Тема начата: xintrea от Декабрь 22, 2008, 21:42



Название: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 22, 2008, 21:42
Здравствуйте!


Весь день бъюсь над компиляцией программы. Перед этим два дня делал ей кардинальную переделку (без промежуточных компиляций). В результате, сейчас не могу скомпилить.

Проблема в том, что компилятор gcc, в случае забывчивости программиста поставить ; или " или }, обычно не показывает то место, где эта ошибка произошла, и догадываться приходится по коственным признакам.

Вот сейчас у меня такая же ситуация. Я столько кода наменял, что вспомнить, где надо перепроверить, нет возможности. А скомпилить не могу, из-за неизвестного места, в котором есть проблема.

Что делать? Слышал, вроде есть какие-то дополнительные анализаторы кода, но те что я нашел - это для аудита безопасности кода.

Вот вывод ошибок
Код:
src/treeitem.h:75: ошибка: ISO C++ запрещает декларации 'recordtabledata' без типа
src/treeitem.h:75: ошибка: expected ';' before '*' token
src/treeitem.h:89: ошибка: 'recordtabledata' does not name a type
src/recordtablemodel.h:38: ошибка: 'recordtabledata' не был декларирован
src/recordtablemodel.h:43: ошибка: ISO C++ запрещает декларации 'recordtabledata' без типа
src/recordtablemodel.h:43: ошибка: expected ';' before '*' token
src/recordtablescreen.h:35: ошибка: 'recordtabledata' не был декларирован
src/recordtablescreen.h:125: ошибка: ISO C++ запрещает декларации 'recordtabledata' без типа
src/recordtablescreen.h:125: ошибка: expected ';' before '*' token

src/recordtablescreen.cpp:173: ошибка: prototype for 'void recordtablescreen::set_tabledata(recordtabledata*)' does not match any in class 'recordtablescreen'
src/recordtablescreen.h:35: ошибка: претендент: void recordtablescreen::set_tabledata(int*)

src/recordtablescreen.cpp:173: предупреждение: unused parameter 'rtdata'

src/recordtablescreen.cpp: In member function 'void recordtablescreen::select(const QModelIndex&)':
src/recordtablescreen.cpp:217: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::add_new(int, QString, QString, QString, QString, QString)':
src/recordtablescreen.cpp:312: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::edit_field_context()':
src/recordtablescreen.cpp:341: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::edit_field(int, QString, QString, QString, QString)':
src/recordtablescreen.cpp:373: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::delete_records()':
src/recordtablescreen.cpp:426: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::copy()':
src/recordtablescreen.cpp:459: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::moveup()':
src/recordtablescreen.cpp:642: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::movedn()':
src/recordtablescreen.cpp:662: ошибка: нет декларации 'table' в этой области видимости

По какой-то причине невозможна работа с классом recordtabledata. Обычно такие ошибки возникают, если забыть подключить заголовок recordtabledata.h через include, или в прототипе класса забыть за закрывающей скобкой поставить ; . Везде где нужно (и ненужно) заголовок подключен. В pro файле в HEADERS и SOURCES добавлены recordtabledata.h и recordtabledata.cpp соответсвенно.


Обращаю внимание на странную ошибку

Код:
prototype for 'void recordtablescreen::set_tabledata(recordtabledata*)' does not match any in class 'recordtablescreen'
src/recordtablescreen.h:35: ошибка: претендент: void recordtablescreen::set_tabledata(int*)

Претендента set_tabledata(int*) у меня нигде на самом деле в коде нет, а есть
 
Код:
 // Прототип в классе recordtablescreen (файл recordtablescreen.h)
 void set_tabledata(recordtabledata *);

 // Реализация (файл recordtablescreen.cpp)
 void recordtablescreen::set_tabledata(recordtabledata *rtdata)
 {
  ...
 }


Поток ошибок с table связано с тем, что член класса table имеет тип recordtabledata.


В общем, все указывает на проблему в классе recordtabledata. Я его излазил вдоль и поперек, ошибки не вижу. Но почему-то с ним происходят вот такие странные вещи. И почему-то в нем компилятор ошибок не обнаруживает.


Вопрос. Что делать, как найти ошибку?


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: pastor от Декабрь 22, 2008, 22:06
1. Начать комментирорвать код проекта, пока не исчезнет ошибка. Это давольно кропотлиный процесс
2. Выложеть код, и пусть глянет общественность


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: Rcus от Декабрь 22, 2008, 22:10
А еще есть крайнее средство, когда больше ничего не помогает:
 Посмотреть на компиляции какого файла происходит ошибка, запустить его компиляцию с флагом -E (Только препроцессирование - без компиляции, ассемблирования, компоновки) и читать :)


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: BRE от Декабрь 22, 2008, 22:31
А выложи файлик где описывается recordtabledata.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 22, 2008, 22:32
1. Начать комментирорвать код проекта, пока не исчезнет ошибка. Это давольно кропотлиный процесс

Это я уже делал в подозрительных местах, такое впечатление что проблема не в реализациях функций, а именно в препроцессинге, где-то что-то теряется как будто.

2. Выложеть код, и пусть глянет общественность

Чтоб сильно не напрягать общественность, прошу попробовать скомпилить код под виндой (т.е. не в gcc под Linux), может другой компилер скажет более конкретно. Прога на чистом Qt, никаких дополнительных библиотек не используется.

Архив приложен.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: panAlexey от Декабрь 22, 2008, 22:38
Начать пользоваться системой хранения версий.
простой диф тебе покажет где ты чего менял, а следовательно и проанализировать правки с момента нормальной компиляции.
ПС. Я один раз скобку на наймспейсе забыл закрыть, ох и понаслушался....


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 22, 2008, 22:47
Начать пользоваться системой хранения версий.
простой диф тебе покажет где ты чего менял, а следовательно и проанализировать правки с момента нормальной компиляции.
ПС. Я один раз скобку на наймспейсе забыл закрыть, ох и понаслушался....

Наскока я понимаю, в систему хранения версий имеет смысл коммитить как минимум только рабочий (компилируемый) код. Это, вроде как, основное правило пользования системы контроля версий. Так что, когда глобально перелопачиваешь код, в vcs лучше не коммитить промежутки. Не знаю, так ли это или нет, ибо вместо vcs использую rdiff-backup, но и им я не делаю копий пока код не заработает хоть в каком виде.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: panAlexey от Декабрь 22, 2008, 22:48
linetmp=table.at(pos)); // Раньше было index.row()
Спасибо креатору :) Поиск меньше минуты занял...


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 22, 2008, 22:55
linetmp=table.at(pos)); // Раньше было index.row()
5 баксов. Спасибо креатору :)))))
http://unnstudio.googlecode.com/files/spasCrea.JPG

Только что хотел спросить, как ты это нашел!

Щас поставлю креатор для вот такой валидации... Там он еще не показывает ошибку? А то компиляция аналогично пока завершается.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: panAlexey от Декабрь 22, 2008, 23:12
все, больше не могу искать. работать надо.
больше ничего не нашел.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 22, 2008, 23:14
все, больше не могу искать. работать надо.
больше ничего не нашел.

Спасибо большое, дальше сам.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: panAlexey от Декабрь 22, 2008, 23:33
В принцыпе можно написать скрипт, который подсчитывает парные скобки.
Не шибко сложно, должно помочь...


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: Eugene Efremov от Декабрь 22, 2008, 23:46
Убрать зависимости хедеров друг от друга, т.е. заменить строки вида «#include "recordtabledata.h"» на «class recordtabledata;». А сами инклуды перенести из h в cpp. Это позволит, по крайней мере, локализовать хедер, в котором ошибка... возможно. Мда, это надо было сделать до того как она появилось, а сейчас есть риск новые насажать.

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

P.S. Просмотрел код под колорером (http://colorer.sourceforge.net/), явных синтаксических ошибок (т.е. таких, которые бы колорер обнаруживал) помимо той скобки там нет.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: lit-uriy от Декабрь 23, 2008, 06:19
Наскока я понимаю, в систему хранения версий имеет смысл коммитить как минимум только рабочий (компилируемый) код. Это, вроде как, основное правило пользования системы контроля версий.
Нет такого правила. Правила ты придумываешь сам. Есть сложившиеся тактики, одна из них заключается в копировании рабочего каталога (trunk) или его части в ветки (branch). А там изгаляйся как тебе удобно (в том числе любое кол-во промежуточных правок). После окончания эксперементов делаешь слияние ветки с рабочим каталогом.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: Mikhail от Декабрь 23, 2008, 12:59
Убрать зависимости хедеров друг от друга, т.е. заменить строки вида «#include "recordtabledata.h"» на «class recordtabledata;». А сами инклуды перенести из h в cpp. Это позволит, по крайней мере, локализовать хедер, в котором ошибка... возможно. Мда, это надо было сделать до того как она появилось, а сейчас есть риск новые насажать.

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

P.S. Просмотрел код под колорером (http://colorer.sourceforge.net/), явных синтаксических ошибок (т.е. таких, которые бы колорер обнаруживал) помимо той скобки там нет.


Скорее всего отсутствие логики в проекте.
У тебя в каждом включаемом файле включаются в основном все остальные включаемые файлы.
Вернись к рабочей версии и по шагам иди вперед.
Избегай включать ненужные в хедеры все другие.
Если уж надо, то используй конструкцию
class ttt;
а инклуд уже в cpp файл.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: ритт от Декабрь 23, 2008, 15:41
http://osdab.42cows.org/tips/predeclare.php?mode=advanced


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 24, 2008, 10:16
Все, парни, всем спасибо!

Победил я эту траблу. Стал действовать жостко и планомерно. Вначале написал скрипт проверки четности " и соответствия количества () и {}. Все чисто было.

Потом из всех *.h файлов все инклуды попереносил в *.cpp файлы. По мере компиляции, если в *.h файле был неизвестный тип, добавлял инклюд в *.h. В конце концов все собралось.

По поводу прописывания предварительного объявления класса class вместо include, слышал что не все компилеры поддерживат эту возможность. Так как проверить на винде компиляцию пока не могу, то стараюсь писать универсальный код. Кроме того, внятной информации по предварительному объявлению класса не нашел. В книгах, что есть у меня, про это вообще ничего не написано. Да честноговоря пока не могу найти ни одной книги по c/c++, в которой бы по-человечески было написано как компилируется проект, как пользоваться include. Почему-то этот вопрос везде обходят стороной.


Вот на лоре мне такое написали:

Цитировать
1. Препроцессор икнклудит тело заголовочника recordtabledata.h и делает #define RECORDTABLEDATA_H.
2. Далее он инклудит treeitem.h и делает #define TREEITEM_H.
3. Потом идёт дальше по телу treeitem.h и обнаруживает повторный #include "recordtabledata.h", заходит в него и... пропускает! Вместе с обьявлением RecordTableData. Получаешь вместо инклуда пустое место. Потому что смотри пункт 1: уже был #define RECORDTABLEDATA_H.

Не могу понять это рассуждение. В пункте 2 у нас произошел инклуд recordtabledata.h и treeitem.h в "общий" файл. Поэтому то, что в пункте 3 инклюд recordtabledata.h уже не будет инклюдится, нам побоку. Что я понял не так?


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: BRE от Декабрь 24, 2008, 10:34
Вот попробуй собрать этот проект:
classA.h
Код:
#ifndef CLASSA_H
#define CLASSA_H

#include "classB.h"

class ClassA : public ClassB
{
public:
ClassA() {}

int     val;
};

#endif // CLASSA_H

classB.h
Код:
#ifndef CLASSB_H
#define CLASSB_H

#include "classA.h" // [1]

//class ClassA; // [2]

class ClassB
{
public:
ClassB() {}

ClassA  *ptr;
};

#endif // CLASSB_H

main.cpp
Код:
#include "classA.h"

int main( int, char *[] )
{
ClassA t;

return 0;
}

Ты увидешь ту же ошибку, которая была у тебя. Если ты поменяешь комментарии в строках [1] и [2] файла classB.h, то проект собереться. Ошибка происходит из-за циклической зависимости заголовков classA.h и classB.h.

Если в описании класса используется указатель или ссылка на другой класс,  лучше не включать его хедер, а описать как class ClassA;
Этим ты явно указываешь компилятору, что знаешь такой класс, а размер указателя/ссылки компилятор знает сам для целевой машины.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: ритт от Декабрь 24, 2008, 10:39
бегло пробежался по заголовкам...
main.h -> mainwindow.h -> recordtabledata.h, ..., treeitem.h -> recordtabledata.h
примерно так.
второй раз recordtabledata.h вызывается из контекста treeitem.h, когда гвард RECORDTABLEDATA_H уже включён - т.е. хедер подключился, но в контексте mainwindow.h, который теперь уже дёргать снизу бесполезно.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: ритт от Декабрь 24, 2008, 10:43
зы. с предекларами проблем не должно быть - можешь смело пользоваться (если не веришь, загляни в любые заголовки кутэ и вспомни количество платформ и компиляторов, поддерживаемых кутэ)
и что немаловажно, с предекларами крупный проект будет собираться значительно шустрее...


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: BRE от Декабрь 24, 2008, 10:51
Что бы проше было разобраться сделай для моего примера: g++ -E main.cpp, для каждого варианта и сравни.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 24, 2008, 14:22
Что бы проше было разобраться сделай для моего примера: g++ -E main.cpp, для каждого варианта и сравни.

Ну в общем, проблема в том, что вверх по коду в "результирующем" файле вылазит инклюд, который стоит последним в цепочке инклюдов. И если в этом заголовочнике есть использование других классов, то заголовки таких классов будут расположены ниже по коду. Посему, произойдет ошибка.

Такие древние условности меня сильно огорчают. Это то же самое, что некоторые компилеры требуют прототипы функций, если реализация расположена ниже по коду, а другие не требуют. Казалось бы, невелика задача - пробежать код вперед и посмотреть наличие реализации. Так ведь нет - пиши прототип. Или когда синтаксический анализатор компилера не обнаруживает ошибки вида function()); а реалтаймовый анализатор IDE их видит мгновенно. Это уже вообще никуда не годится.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: BRE от Декабрь 24, 2008, 14:30
Такие древние условности меня сильно огорчают. Это то же самое, что некоторые компилеры требуют прототипы функций, если реализация расположена ниже по коду, а другие не требуют. Казалось бы, невелика задача - пробежать код вперед и посмотреть наличие реализации. Так ведь нет - пиши прототип. Или когда синтаксический анализатор компилера не обнаруживает ошибки вида function()); а реалтаймовый анализатор IDE их видит мгновенно. Это уже вообще никуда не годится.
Стандарты это. Без них была бы вообще жопа.  ;)
А ты сейчас поставь (когда проект собирается) не нужную скобку, думаю эту ошибку ты найдешь значительно быстрей.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: ритт от Декабрь 24, 2008, 15:03
> Казалось бы, невелика задача - пробежать код вперед и посмотреть наличие реализации.
пробегись по-шустрому по коду glibc и найди реализацию функции strcpy...или по коду kernel.org и ткни пальцем в semtimedop...угу?

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

зы. приведи пример такого компилера? навскидку ничего подобного не вспоминается...даже какой-нибудь задрипанный паскаль имел ключ forward (или как-то так)


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забm
Отправлено: Eugene Efremov от Декабрь 24, 2008, 18:46
По поводу прописывания предварительного объявления класса class вместо include, слышал что не все компилеры поддерживат эту возможность. Так как проверить на винде компиляцию пока не могу, то стараюсь писать универсальный код. Кроме того, внятной информации по предварительному объявлению класса не нашел. В книгах, что есть у меня, про это вообще ничего не написано.

Стандарт C++. ISO/IEC 14882:2003(E), 9.1 §2:
Цитировать
Note: Such declarations allow definition of classes that refer to each other. [Example:
Код
C++ (Qt)
class Vector;
class Matrix {
// ...
friend Vector operator*(Matrix&, Vector&);
};
class Vector {
// ...
friend Vector operator*(Matrix&, Vector&);
};
 
Declaration of friends is described in 11.4, operator functions in 13.5. ]
См. также раздел 3.1.

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

Что касается книг — подробный разбор того, в каких случаях достаточно объявления класса, а в каких — требуется полное определение, я видел не то у Саттера, не то у Мейерса. (Их, кстати, в любом случае стоит прочитать обоих).

Если кратко, то записи «class Foo;» хватит для использования указателей и ссылок на класс, а также для объявления методов, которые его используют. В общем, для всего того, что обычно лежит как раз в хедерах. Если же нужно знать размер класса, создавать объекты, вызывать методы, создавать производные классы и т.д. — нужно полное определение.

Да честноговоря пока не могу найти ни одной книги по c/c++, в которой бы по-человечески было написано как компилируется проект, как пользоваться include. Почему-то этот вопрос везде обходят стороной.

Хм... Страуструп подойдет? Разделы 7.8, 9.3.2, 9.3.3. Ну и глава 16 стандарта — для более продвинутого чтения...

Но вообще, действительно — имеется некоторый пробел в литературном освещении вопроа. Бегло просмотрел имеющиеся у меня источники — про препроцессор везде пишут довольно скупо. Единственное исключение — руководство по GCC Гриффиса. Но там много нестандартных фич.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 24, 2008, 20:35
> Казалось бы, невелика задача - пробежать код вперед и посмотреть наличие реализации.
пробегись по-шустрому по коду glibc и найди реализацию функции strcpy...или по коду kernel.org и ткни пальцем в semtimedop...угу?

зы. приведи пример такого компилера? навскидку ничего подобного не вспоминается...даже какой-нибудь задрипанный паскаль имел ключ forward (или как-то так)

Как ни странно, gcc 3.x версии в режиме компиляции C кода (не C++) именно это и делает.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: ритт от Декабрь 25, 2008, 02:31
> Казалось бы, невелика задача - пробежать код вперед и посмотреть наличие реализации.
пробегись по-шустрому по коду glibc и найди реализацию функции strcpy...или по коду kernel.org и ткни пальцем в semtimedop...угу?

зы. приведи пример такого компилера? навскидку ничего подобного не вспоминается...даже какой-нибудь задрипанный паскаль имел ключ forward (или как-то так)

Как ни странно, gcc 3.x версии в режиме компиляции C кода (не C++) именно это и делает.

гоняет вперёд-назад? не знал...
т.е. что, если переложить пример BRE на си и попробовать скомпилить тройкой, всё заведётся и поедет?


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 25, 2008, 13:46
Пример BRE не знаю как на си переделать, а код вида

Код:
#include <stdio.h>

int main(int argc,char **argv)
{
 printf("%d",userfunc(3));
}

int userfunc(int x)
{
 return x+pow2(x);
}

int pow2(int x)
{
 return x*x;
}

Замечательно компилится на gcc как третей так и, кстати, четвертой ветки.

gcc -L/usr/lib -x c -o userfunc userfunc.c

причем совершенно без разницы, в какой последовательности будут прописаны функции.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: ритт от Декабрь 25, 2008, 14:35
я не заметил момент, в который мы перестали говорить о декларациях классов и перешли на обсуждение деклараций функций...это неравнозначные вопросы
а твой пример будет компилиться и на втором гцц


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: BRE от Декабрь 25, 2008, 14:48

причем совершенно без разницы, в какой последовательности будут прописаны функции.

А ты варнинги, варнинги включи (-Wall).
А то что gcc нашел эти функции в одном файле, ни о чем не говорит. А если функцию userfunc описать в другом файле. Он ее найдет?


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: panAlexey от Декабрь 25, 2008, 16:56
Замечательно компилится на gcc как третей так и, кстати, четвертой ветки.
момент,
а 4-ка разве еще не числится  экспериментальной?
http://sourceforge.net/project/showfiles.php?group_id=2435
Testing: gcc-4.3.0-20080502-mingw32-alpha


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: ритт от Декабрь 25, 2008, 17:08
Замечательно компилится на gcc как третей так и, кстати, четвертой ветки.
момент,
а 4-ка разве еще не числится  экспериментальной?
http://sourceforge.net/project/showfiles.php?group_id=2435
Testing: gcc-4.3.0-20080502-mingw32-alpha

смущает суффикс "-alpha"? а если взглянуть шире (суффикс "-mingw32-alpha")?


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 25, 2008, 17:27
я не заметил момент, в который мы перестали говорить о декларациях классов и перешли на обсуждение деклараций функций...это неравнозначные вопросы

Вот он :)

Цитировать
...Это то же самое, что некоторые компилеры требуют прототипы функций, если реализация расположена ниже по коду, а другие не требуют. Казалось бы, невелика задача - пробежать код вперед и посмотреть наличие реализации. Так ведь нет - пиши прототип. Или когда синтаксический анализатор компилера не обнаруживает ошибки вида function()); а реалтаймовый анализатор IDE их видит мгновенно. Это уже вообще никуда не годится.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: panAlexey от Декабрь 25, 2008, 17:38
смущает суффикс "-alpha"?
Да.
а если взглянуть шире (суффикс "-mingw32-alpha")?
все равно не вытанцовывается. подожду приставки -stable. или отсутствия приставок.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 25, 2008, 17:42

причем совершенно без разницы, в какой последовательности будут прописаны функции.

А ты варнинги, варнинги включи (-Wall).

Ну таки да, будет удивляца - а чего это прототипов нет? Но соберется. И будет работать. Конечно, c++ в этом смысле строже - нет прототипа при вызове - досвидания. И пофигу, что он на самом деле есть дальше по коду. В этом смысле это более правильно, ибо есть стандарты. А наличие предупреждений, как считает создатель языка D - это следствие неправильного конструирования языка. В языке при компиляции должны выявляться только ошибки. Есть ошибки - нет результата. Нет ошибок - получи свой бинарь.

А то что gcc нашел эти функции в одном файле, ни о чем не говорит. А если функцию userfunc описать в другом файле. Он ее найдет?

Конечно, вопрос в том как прописывать. Прописывание в другом файле подразумевает, что будет *.h и *.c файл. В *.h - прототипы, в *.c - реализации. А так как мы экспериментируем "без прототипов", то можно прописать реализацию в h файл и подключить его. И все соберется. Да и почему бы собственно не собраться, если по факту компилится "результирующий" после препроцессинга файл.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: ритт от Декабрь 25, 2008, 17:45
http://www.gnu.org/software/gcc/
Current release series: GCC 4.3.2
Status: 2008-11-03 (regression fixes and docs only).

а что ж ты вендой пользуешься - не ждёшь суффикса "-stable"? :)


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: ритт от Декабрь 25, 2008, 18:01
> Да и почему бы собственно не собраться...

действительно...main.c -> myfunc.h - почему бы не собраться? а ты включи гварды и сделай реализацию по-человечески (чтобы не компилить каждый раз один и тот же код) - соберётся?

> А наличие предупреждений, как считает создатель языка D - это следствие неправильного конструирования языка. В языке при компиляции должны выявляться только ошибки. Есть ошибки - нет результата. Нет ошибок - получи свой бинарь.

с каких пор машина стала умнее человека? и вто же время, с каких пор человеческий фактор перестал учитываться?

вот днём только ругался, разбирая чужой код (примерно такой):
Код:
	foreach($values as $key => $value)
{
if(is_array($value) && array_key_exists("VALUE", $value))
{
$values["~".$key] = $value;
$values[$key] = $value["VALUE"];
}
}
и ни единого ворнинга не будет, и даже будет работать...
язык без чётких стандартов только поощряет быдлокодеров, их становится всё больше, они сбиваются в кучки и начинают писать быдлопроекты...а потом сидишь и три дня патчишь это гомно :(


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 25, 2008, 18:51
вот днём только ругался, разбирая чужой код (примерно такой):
Код:
	foreach($values as $key => $value)
{
if(is_array($value) && array_key_exists("VALUE", $value))
{
$values["~".$key] = $value;
$values[$key] = $value["VALUE"];
}
}
и ни единого ворнинга не будет, и даже будет работать...

С каких пор машина стала умнее человека? Чувак написал код, где в цикле меняет массив, который обходится данным циклом. Может, он именно это и хотел сделать? :)

язык без чётких стандартов только поощряет быдлокодеров, их становится всё больше, они сбиваются в кучки и начинают писать быдлопроекты...а потом сидишь и три дня патчишь это гомно :(

Пускай пишут. Это гораздо лучше, чем высокий порог вхождения в язык, или высокий порог овладевания профессиональными методиками. Потому что, в таких случаях в языке и сообществе вокруг языка образуется застой. А еще хуже - под заказ "профессионалы" начинают писать программы примитивными методами "пишу на C++ в стиле фортрана".

Кстати, PHP (это же PHP?) замечательный язык. Код ясный, наглядный, простой. Потому им все и пользуются. И пускай. Я вон как трушный линуксоид начал писать проверялку баланса кавычек и кода на шелле. Обложился книгами, перерыл интернет, потратил полдня, в результате не смог написать нормальную функцию чтоб чотко работала и с кавычками, и со скобками. Кавычки надо экранировать. Скобки ненадо. Но надо в экранировать в регвырах. А кавычки - дважды. Короче плюнул в конце концов, и за пять минут написал все на php, открыв php.net. Только о потраченном времени пожалел.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: BRE от Декабрь 25, 2008, 18:57
Только о потраченном времени пожалел.
Не жалей.  ;)
Опыт получил, не смотря на результат.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: ритт от Декабрь 25, 2008, 19:01
> Может, он именно это и хотел сделать?

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

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

а ты как трушный линухоид должен был написать скрипт на баше или хотя бы перле без всякий справочников...низачот :)


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: xintrea от Декабрь 25, 2008, 19:27
Только о потраченном времени пожалел.
Не жалей.  ;)
Опыт получил, не смотря на результат.

Да, теперь я еще раз убедился, что писать автоматизировалку на баше ни в коем случае нельзя. Ибо неизвестно время, которое будет затраченно на разработку, а затык может быть на любом простом месте.

Чего только стоит

a=`expr 5+4`
echo ${a}

пойди разберись, как делать чтоб вычислялось математическое выражение, а не возвращало строку "5+4". В доке ничего по поводу не написано, спецключей нет. Должен возвращаться результат 9, а в реале - что пишешь, то и возвращает. Конечно, через час разобрался почему так. А вы, ребята, догадались? :)


PHP для скриптования - наше все! Ибо C-подобный синтаксис.


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: panAlexey от Декабрь 25, 2008, 19:33
а что ж ты вендой пользуешься - не ждёшь суффикса "-stable"? :)
я винду ставлю только тогда, когда на неё родимую второй первиспук выходит, не надо ля-ля...


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: ритт от Декабрь 25, 2008, 20:25
а я и не ля-ля... :)
сдуру поставил на хрюшу сп3:
 - хехе, смешной какой - распаковался на флэшку...
 - о, да, "установите данное обновление для исправления ошибок в сп3" (пакет помечен датой с разрывом в несколько дней с сп3 - красота)
// пара ребутов
 - оо, глядите-ка, исправили один из самых старых багов в эксплорере
// через пять минут
 - где, сцуко, мои впа? ладно, настрою заново... ААА, где вкладка настройки?

вот так посидел пару дней без инета и...переустановил хрю с сп2 начисто

// ---
а гцц давно уже вполне стабилен...сейчас только по-мелочи правят, а активно работают над 4.4


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забm
Отправлено: Eugene Efremov от Декабрь 26, 2008, 00:19
причем совершенно без разницы, в какой последовательности будут прописаны функции.
А ты варнинги, варнинги включи (-Wall).
А то что gcc нашел эти функции в одном файле, ни о чем не говорит. А если функцию userfunc описать в другом файле. Он ее найдет?

Вообще-то, он их и в одном файле не ищет. На самом деле происходит следующее:
Код:
usefunc.c: In function `main':
usefunc.c:5: warning: implicit declaration of function `userfunc'
usefunc.c: In function `userfunc':
usefunc.c:10: warning: implicit declaration of function `pow2'
usefunc.c: In function `main':
usefunc.c:6: warning: control reaches end of non-void function

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

Что именно функции передается, будет ли она это принимать или сразу повиснет — при этом, естественно, не проверяется.

Это в С стандартное поведение, кстати. И одна из причин введения в C++ строгого контроля типов, потому что ошибок насажать с таким подходом — как нечего делать...


Название: Re: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }
Отправлено: BRE от Декабрь 26, 2008, 09:37
Каюсь.  :)
С момента выхода Borland C++, сишными компиляторами не пользовался....