Russian Qt Forum
Сентябрь 21, 2024, 11:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или }  (Прочитано 29457 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Декабрь 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. Я его излазил вдоль и поперек, ошибки не вижу. Но почему-то с ним происходят вот такие странные вещи. И почему-то в нем компилятор ошибок не обнаруживает.


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

Собираю информацию по крупицам
http://webhamster.ru
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Декабрь 22, 2008, 22:06 »

1. Начать комментирорвать код проекта, пока не исчезнет ошибка. Это давольно кропотлиный процесс
2. Выложеть код, и пусть глянет общественность
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Rcus
Гость
« Ответ #2 : Декабрь 22, 2008, 22:10 »

А еще есть крайнее средство, когда больше ничего не помогает:
 Посмотреть на компиляции какого файла происходит ошибка, запустить его компиляцию с флагом -E (Только препроцессирование - без компиляции, ассемблирования, компоновки) и читать Улыбающийся
Записан
BRE
Гость
« Ответ #3 : Декабрь 22, 2008, 22:31 »

А выложи файлик где описывается recordtabledata.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Декабрь 22, 2008, 22:32 »

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

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

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

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

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

Собираю информацию по крупицам
http://webhamster.ru
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #5 : Декабрь 22, 2008, 22:38 »

Начать пользоваться системой хранения версий.
простой диф тебе покажет где ты чего менял, а следовательно и проанализировать правки с момента нормальной компиляции.
ПС. Я один раз скобку на наймспейсе забыл закрыть, ох и понаслушался....
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #6 : Декабрь 22, 2008, 22:47 »

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

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

Собираю информацию по крупицам
http://webhamster.ru
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #7 : Декабрь 22, 2008, 22:48 »

linetmp=table.at(pos)); // Раньше было index.row()
Спасибо креатору Улыбающийся Поиск меньше минуты занял...
« Последнее редактирование: Декабрь 22, 2008, 22:56 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #8 : Декабрь 22, 2008, 22:55 »

linetmp=table.at(pos)); // Раньше было index.row()
5 баксов. Спасибо креатору Улыбающийся))))
http://unnstudio.googlecode.com/files/spasCrea.JPG

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

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

Собираю информацию по крупицам
http://webhamster.ru
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #9 : Декабрь 22, 2008, 23:12 »

все, больше не могу искать. работать надо.
больше ничего не нашел.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #10 : Декабрь 22, 2008, 23:14 »

все, больше не могу искать. работать надо.
больше ничего не нашел.

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

Собираю информацию по крупицам
http://webhamster.ru
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #11 : Декабрь 22, 2008, 23:33 »

В принцыпе можно написать скрипт, который подсчитывает парные скобки.
Не шибко сложно, должно помочь...
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Eugene Efremov
Гость
« Ответ #12 : Декабрь 22, 2008, 23:46 »

Убрать зависимости хедеров друг от друга, т.е. заменить строки вида «#include "recordtabledata.h"» на «class recordtabledata;». А сами инклуды перенести из h в cpp. Это позволит, по крайней мере, локализовать хедер, в котором ошибка... возможно. Мда, это надо было сделать до того как она появилось, а сейчас есть риск новые насажать.

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

P.S. Просмотрел код под колорером, явных синтаксических ошибок (т.е. таких, которые бы колорер обнаруживал) помимо той скобки там нет.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #13 : Декабрь 23, 2008, 06:19 »

Наскока я понимаю, в систему хранения версий имеет смысл коммитить как минимум только рабочий (компилируемый) код. Это, вроде как, основное правило пользования системы контроля версий.
Нет такого правила. Правила ты придумываешь сам. Есть сложившиеся тактики, одна из них заключается в копировании рабочего каталога (trunk) или его части в ветки (branch). А там изгаляйся как тебе удобно (в том числе любое кол-во промежуточных правок). После окончания эксперементов делаешь слияние ветки с рабочим каталогом.
Записан

Юра.
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #14 : Декабрь 23, 2008, 12:59 »

Убрать зависимости хедеров друг от друга, т.е. заменить строки вида «#include "recordtabledata.h"» на «class recordtabledata;». А сами инклуды перенести из h в cpp. Это позволит, по крайней мере, локализовать хедер, в котором ошибка... возможно. Мда, это надо было сделать до того как она появилось, а сейчас есть риск новые насажать.

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

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


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


Страница сгенерирована за 0.057 секунд. Запросов: 23.