Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Мобильные платформы > Другие мобильные платформы
Перезагрузить страницу Ошибка как ее найти в программном коде
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
night-stels night-stels вне форума
Member
 
Сообщений: 440
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.08.2008
По умолчанию Ошибка как ее найти в программном коде - 18.08.2008, 19:54

Здравствуйте! Очень нужна Ваша помощь.

Не могу понять, что за ошибка происходит в программе. (сдк BREW 3.1.5. на VSC++6.0)

Вот код: (неполный конечно...) ошибка происходит в момент вызова функции MyReadFs
Еще одно важное замечание. Ошибка происходит при втором-третьем срабатывании этого события (нажатия Кнопки СЕЛЕКТ).

Код:
case AVK_SELECT:
     ind = IMENUCTL_GetSel( pMe->pIMenu );
     if ( ind == 0  && pszDir != "fs:/")
     {
                char* pszTmp = STRRCHR ( pszDir, '/');
    IMENUCTL_DeleteAll ( pMe->pIMenu );
    if ( pszTmp )
    {
          char* pszTmpDir = (char*)MALLOC( STRLEN (pszDir));
          int k = pszTmp - pszDir;
          int m;
          for (m = 0; m <= k; m++)
          pszTmpDir[m] = pszDir[m];
          FREE(pszDir);
          pszDir = (char*)MALLOC(m);
          for (m = 0; m <= k; m++)
                     pszDir[m] = pszTmpDir[m];
                      if ( STRLEN( pszDir ) >= 4 ) pszDir[m] = '\0';
          
                      MyReadFs( pMe, pszDir );
    
                      IMENUCTL_Redraw ( pMe->pIMenu );
          IDISPLAY_Update ( pMe->pIDisplay );
          if (pszTmp) FREE(pszTmp);
    };
                return (TRUE);
       }
Тут много лишнего в копировании строк, но проблема не в этом. Это проверено.
Прототип функции:
Код:
static void MyReadFs (Browser* pMe, const char* pszBuf)
Вот так вот выглядит эта ошибка на дисассемблере.
Код:
004B1590   call        0043D940
004B1595   push        ecx
004B1596   push        esi
004B1597   push        edi
004B1598   pushfd
004B1599   mov         dword ptr [esp+0Ch],eax
004B159D   btr         dword ptr [esp],12h
004B15A2   sbb         dword ptr [esp+0Ch],eax
004B15A6   and         dword ptr [esp+0Ch],40000h
004B15AE   popfd
004B15AF   mov         al,byte ptr [esp+14h]
004B15B3   mov         ecx,dword ptr [esp+18h]
004B15B7   mov         edi,dword ptr [esp+10h]
004B15BB   mov         dl,al
004B15BD   mov         dh,dl
004B15BF   mov         esi,ecx
004B15C1   shr         ecx,2
004B15C4   mov         eax,edx
004B15C6   shl         eax,10h
004B15C9   mov         ax,dx
004B15CC   mov         edx,edi
004B15CE   rep stos    dword ptr [edi]  <--------ТУТ ОШИБКА---------
Я в этом плохо понимаю, но вроде как привел код с начала вызова функции. Ошибка возникает в последней строке.
Объясните пжлст, кто понимает. Чем она может быть вызвана?? Есть подозрения, что переполняется стек...
Ответить с цитированием
  (#2 (permalink)) Старый
zevun zevun вне форума
Member
 
Сообщений: 551
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.08.2007
По умолчанию 18.08.2008, 20:34

Похоже выход за границы массива. Возможно строка '\0' не заканчивается.

Вот этот код очень странный
Код:
if ( STRLEN( pszDir ) >= 4 ) pszDir[m] = '\0';
STRLEN ищет в строке '\0'. А затем мы его ставим . Причём вообще никакой гарантии, что строка будет заканчиваться нулём!!!

Вот ещё загадка
Код:
pszDir != "fs:/"
Что тут сравнивается? Равен ли указатель указателю на строку зашитую в бинарнике компилятором чёрт знает где? Хотите угодаю - нет не равен, и не будет равен никогда!

P.S Вы в следующий раз напишите, что за ошибка, тобишь текст ошибки. Если это был бы переполненный стек, Вы должны были увидеть что-то вроде "Stack overflow", а у Вас, подозреваю, "Access Violation".

P.P.S И не надо писать копирование строк. Для этого есть функции типа strcpy и др. В BREW они тоже есть, поищите.
Ответить с цитированием
  (#3 (permalink)) Старый
night-stels night-stels вне форума
Member
 
Сообщений: 440
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.08.2008
По умолчанию 19.08.2008, 02:37

Цитата:
а у Вас, подозреваю, "Access Violation".
Абсолютно верно.

Цитата:
Вот этот код очень странный
Код:
char* pszTmp = STRRCHR ( pszDir, '/');
мы получаем указатель на последнее вхождение символа '/' в строку (строки в данном случае это пути, думаю Вы знаете как они записываются "fs:/folder1/folder2" и т.п)
Суть в том, что нам надо найти папку, на уровень выше данной. т.е. для "fs:/folder1/folder2" получить "fs:/folder1" без слэша в конце.
Загвоздка в том, что если верхним уровнем является корень "fs:/" то слэш нужно оставлять.
Тот код который был приведен выше (копирование, дополнительный буффер) уже был до этого исправлен. Дело в том, что я работаю в компании где разработкой таргета занимается далеко не один человек. Этот код был выкачан с перфорса, и не берусь судить кто его писал. Моя задача фиксить баги.

Код я переделал,
Ныне он выглядит так:
Код:
case AVK_SELECT:
     ind = IMENUCTL_GetSel( pMe->pIMenu );
     if ( ind == 0  && pszDir != "fs:/")
     {
          char* pszTmp = STRRCHR ( pszDir, '/');   //получаем указатель на последнее вхождение слэша
          IMENUCTL_DeleteAll ( pMe->pIMenu );
          if ( pszTmp )
          {
               *pszTmp = '/0'   //на месте последнего вхождения слэша ставим нульсимвол, обрезая таким образом pszDir.
                //вот тут то и надо проверить, прежде чем передавать в функцию не получилось ли у нас "fs:" без слэша.
                //проверяем, и если нада смещаем нуль символ вправо, а на его месте дописываем слэш.
               if (*(pszDir+3) == '\0')  //то есть если строка на 4 от начала байте заканчивается (а такое возможно только если она есть "fs:")
               {
                     *(pszDir+3) = '/';         
                     *(pszDir+4) = '\0';  //в той версии это делалось так:
                              //if ( STRLEN( pszDir ) >= 4 ) pszDir[m] = '\0'; если длина строки больше 4 то на 4
                              // символе ставим нульсимвол. Опять же повторюсь, придумано не мной, но при отладке и контроле памяти все
                              // работает корректно. по крайней мере в рамках данной задачи. Проверял не один раз.

               }  
                MyReadFs( pMe, pszDir );
                IMENUCTL_Redraw ( pMe->pIMenu );
                IDISPLAY_Update ( pMe->pIDisplay );
                if (pszTmp) FREE(pszTmp);
          };
         return (TRUE);
     }
Ошибка и в этом случае таже самая.

В более ранних версиях, которые я смотрел с перфорса, встречалось и копирование с помощью STRCPY и много всяких разных способов. Ошибка же всегда возникает в одном и том же месте.

Цитата:
Вот ещё загадка

<div class='codetop'>Код C++
<div class='codemain'>pszDir != "fs:/"[/code]

Что тут сравнивается? Равен ли указатель указателю на строку зашитую в бинарнике компилятором чёрт знает где? Хотите угодаю - нет не равен, и не будет равен никогда!
При первом просмотре кода, именно это мне и бросилось в глаза. Тут же исправил, и в этом месте стала появляться ошибка. При дебаге в старом варианте, все правильно работает. Именно указатель (а не *pszDir) почему то равен "fs:/". Это для меня не меньшая загадка, но... факт....
Десятки раз просматривал как, что и куда размещается в памяти - все размещалось и читалось корректно, в конце строк всегда присутствовал '\0'. Просмотрел 6 версий.
Кроме того, точно такое же условие есть в другом куске программы (а вернее в функции MyReadFs) и там оно тоже корректно работает. Если по указателю действительно лежит не "fs:/" то условие true. А false в том, и только том случае, если там лежит "fs:/"

Именно от таких вот непоняток я и обратился сюда. Потому что сам в полной расстерянности...
Ответить с цитированием
  (#4 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 19.08.2008, 11:01

Код:
pszDir != "fs:/"
Цитата:
При первом просмотре кода, именно это мне и бросилось в глаза. Тут же исправил, и в этом месте стала появляться ошибка. При дебаге в старом варианте, все правильно работает. Именно указатель (а не *pszDir) почему то равен "fs:/". Это для меня не меньшая загадка, но... факт....
Десятки раз просматривал как, что и куда размещается в памяти - все размещалось и читалось корректно, в конце строк всегда присутствовал '\0'. Просмотрел 6 версий.
Кроме того, точно такое же условие есть в другом куске программы (а вернее в функции MyReadFs) и там оно тоже корректно работает. Если по указателю действительно лежит не "fs:/" то условие true. А false в том, и только том случае, если там лежит "fs:/"
Дружище, а ты слышал, что сравнение строк в языке С\С++ сравнением указателей на эти строки проводить бесполезно? Для этого надо использовать фунцию strcmp, например. Иначе вряд ли когда-нибудь они будут равны.

И ещё, попробуй в дебаггере пошагово программу выполнить, виднее будет, как всё работает, и из-за чего ошибка.
PS: VSC++ 6.0 - это что за среда такая?
Ответить с цитированием
  (#5 (permalink)) Старый
night-stels night-stels вне форума
Member
 
Сообщений: 440
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.08.2008
По умолчанию 19.08.2008, 11:06

Цитата:
Код:
pszDir != "fs:/"
Дружище, а ты слышал, что сравнение строк в языке С\С++ сравнением указателей на эти строки проводить бесполезно? Для этого надо использовать фунцию strcmp, например. Иначе вряд ли когда-нибудь они будут равны.

Jonano, Только я хотел исправить, а ты меня опередил
Дело в том, что начальством приветствуется как можно меньшее изменение старого кода. Я им долго объяснял вчера, что это работает, но только на честном слове и когда-нибудь даст сбой. И вот сегодня только что пришел на работу и мне позволили избавится от этого страшного условия. Теперь там стоит красивое STRCMP( pszDir, "fs:/");

Код:
if ( ind == 0  && STRCMP( pszDir, "fs:/") )

НО! Это все конечно хорошо. Но от ошибки не отдалило ни на миллиметр...
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
night-stels night-stels вне форума
Member
 
Сообщений: 440
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.08.2008
По умолчанию 19.08.2008, 11:31

Цитата:
И ещё, попробуй в дебаггере пошагово программу выполнить, виднее будет, как всё работает, и из-за чего ошибка.
PS: VSC++ 6.0 - это что за среда такая?
Пробовал не раз. Не могу ничего найти. Может у меня уже глаза замылились этим кодом....
Visual C++ 6.0 Enterprise Edition усли быть точным.
Ответить с цитированием
  (#7 (permalink)) Старый
zevun zevun вне форума
Member
 
Сообщений: 551
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.08.2007
По умолчанию 19.08.2008, 14:12

Цитата:
При первом просмотре кода, именно это мне и бросилось в глаза. Тут же исправил, и в этом месте стала появляться ошибка. При дебаге в старом варианте, все правильно работает. Именно указатель (а не *pszDir) почему то равен "fs:/". Это для меня не меньшая загадка, но... факт....
Десятки раз просматривал как, что и куда размещается в памяти - все размещалось и читалось корректно, в конце строк всегда присутствовал '\0'. Просмотрел 6 версий.
Кроме того, точно такое же условие есть в другом куске программы (а вернее в функции MyReadFs) и там оно тоже корректно работает. Если по указателю действительно лежит не "fs:/" то условие true. А false в том, и только том случае, если там лежит "fs:/"
В коде где-нибудь есть такое присваивание?
Код:
pszWhatever="fs:/"
Где pszWhatever - любая переменная.

На первый взгляд старый неисправленный код выглядит абсолютно верно. Кроме этой строчки
Код:
if (pszTmp) FREE(pszTmp);
Вызывается FREE, хотя соответствующего ему вызова MALLOC не было - Access Violation гарантирован.
Ответить с цитированием
  (#8 (permalink)) Старый
night-stels night-stels вне форума
Member
 
Сообщений: 440
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.08.2008
По умолчанию 19.08.2008, 17:17

Цитата:
В коде где-нибудь есть такое присваивание?
Код:
if (pszTmp) FREE(pszTmp);
Вызывается FREE, хотя соответствующего ему вызова MALLOC не было - Access Violation гарантирован.

Код:
if (pszTmp) FREE(pszTmp);
Тоже убрал. Ничего не изменилось. Эту строчку я добавлял сам. Уже от безысходности стал пробовать все-что не лень..=)

Напомню, этот код исполняется несколько раз (от 2 до 25, всегда по разному) а потом "Access Violation".
Очевидно что-то с выделением памяти - это однозначно. Вот только не пойму где.

Еще про
Код:
pszWhatever="fs:/"
В изначальном чендже было:
Код:
boolean Browser_InitAppData(Browser* pMe)
{
    ................
    pszDir = ( char* )MALLOC( 4 * sizeof ( char ) );    
    pszDir = "fs:/";  //еще был чендж с *pszDir = "fs:/";
                .............
}
Но было мной тут же исправлено. (после исправления if ( ind == 0 && pszDir != "fs:/") кстати продолжало корректно работать)

Сейчас инициализируется буфер так:

Код:
boolean Browser_InitAppData(Browser* pMe)
{
    ................
    pszDir = ( char* )MALLOC( 5 * sizeof ( char ) );    
    STRCPY( pszDir, "fs:/" );
                .............
}
Ответить с цитированием
  (#9 (permalink)) Старый
zevun zevun вне форума
Member
 
Сообщений: 551
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.08.2007
По умолчанию 19.08.2008, 19:34

Цитата:
Код:
boolean Browser_InitAppData(Browser* pMe)
{
    ................
    pszDir = ( char* )MALLOC( 4 * sizeof ( char ) );    
    pszDir = "fs:/";  //еще был чендж с *pszDir = "fs:/";
                .............
}
Но было мной тут же исправлено. (после исправления if ( ind == 0 && pszDir != "fs:/") кстати продолжало корректно работать)

Сейчас инициализируется буфер так:

Код:
boolean Browser_InitAppData(Browser* pMe)
{
    ................
    pszDir = ( char* )MALLOC( 5 * sizeof ( char ) );    
    STRCPY( pszDir, "fs:/" );
                .............
}
Теперь понятно почему pszDir != "fs:/" работал. Похоже линкер нашёл дублицирующиеся строки и свёл их в одну. Исправили Вы правильно.

Больше в изначальном коде ошибок не вижу. За исключением, что вместо
Код:
*pszTmp = '/0'
Надо
Код:
*pszTmp = '\0'
А можно какой-нибудь debug trace сделать? Выводить в debug console содержимое pszDir непосредственно перед вызовом MyReadFs( pMe, pszDir );
Ответить с цитированием
  (#10 (permalink)) Старый
zevun zevun вне форума
Member
 
Сообщений: 551
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.08.2007
По умолчанию 19.08.2008, 20:03

Цитата:
Сейчас инициализируется буфер так:
<div class='codetop'>Код C++
<div class='codemain'>boolean Browser_InitAppData(Browser* pMe)
{
................
pszDir = ( char* )MALLOC( 5 * sizeof ( char ) );
STRCPY( pszDir, "fs:/" );
.............
}[/code][/quote]
5 - это не слишком ли маленький размер для строки, которая должна содержать путь к файлу?
Ответить с цитированием
  (#11 (permalink)) Старый
night-stels night-stels вне форума
Member
 
Сообщений: 440
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.08.2008
По умолчанию 20.08.2008, 01:52

Цитата:
5 - это не слишком ли маленький размер для строки, которая должна содержать путь к файлу?
Дело в том, что тут мы выделяем память под конкретную строчку - "fs:/" + нульсимвол.
В дальнейшем (так как заранее предугадать размер строки нельзя, а выделять сразу 100-200 байт не хочется), мы перед тем как записать строку из структуры в pszDir, освобождаем pszDir и снова выделяем для нее память с уже известным (от длины строки) количеством байт. Это делается при выборе пункта меню.
В тот блок кода (он обрабатывает выбор пункта меню "..", т.е. на уровень вверх), который здесь приведен, pszDir приходит уже с выделенной памятью и заполненная строкой содержащей путь к папке (включая имя этой папки) из которой мы пришли.

Моя логика такова:

1. pszDir содержит "fs:/". В меню, итемы содержат все папки находящиеся в "fs:/"
2. Ждем выбора итема в меню.... Выбрали:
Если ( ind == 0 && STRCMP( pszDir, "fs:/") ), то есть мы находимся не в корне и выбран первый итем (".."), то
выполняем тот код, который приведен.
Иначе (т.е. мы выбрали имя какой то папки) мы читаем этот итем в структуру CtlAddItem getInfo, освобождаем pszDir, выделяем память под
pszDir = ( char* )MALLOC( (WSTRLEN( getInfo.pText ) + 1) * sizeof( char ) ), с помощью WSTRTOSTR конвертируем имя папки в pszDir и запускаем
MyReadFs, передавая в нее как параметр pszDir.
MyReadFs обновляет все итемы и записывает в них имена всех папок, находящихся в папке, путь к которой есть pszDir.
3. Далее возвращаемся к пункту 2.

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

Когда мы выбираем ".." у нас по указателю pszDir лежит путь к папке из которой мы пришли. Приведенным кодом мы вырезаем из этого пути имя самой папки и получаем путь на уровень выше. И передаем полученную строку в MyReadFs. Во время вызова которой и возникает ошибка. Она даже не начинает выполняться. Ошибка на стадии заполнения стека функции принимаемыми параметрами.
Ответить с цитированием
  (#12 (permalink)) Старый
night-stels night-stels вне форума
Member
 
Сообщений: 440
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.08.2008
По умолчанию 20.08.2008, 02:28

Цитата:
Больше в изначальном коде ошибок не вижу. За исключением, что вместо
Код:
*pszTmp = '\0'
Да, писал руками, а не копипастом, видимо опечатался. =)

Цитата:
А можно какой-нибудь debug trace сделать? Выводить в debug console содержимое pszDir непосредственно перед вызовом MyReadFs( pMe, pszDir );
Завтра буду на работе - сделаю.
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
zevun zevun вне форума
Member
 
Сообщений: 551
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.08.2007
По умолчанию 20.08.2008, 02:45

После вызова MALLOC надо проверять возвращаемый указатель на NULL. В BREW такое бывает, что память кончилась.
Ответить с цитированием
  (#14 (permalink)) Старый
night-stels night-stels вне форума
Member
 
Сообщений: 440
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.08.2008
Thumbs down 20.08.2008, 13:08

Добавил все проверки перед и после выделения памяти.
Ошибка стала выскакивать намного реже, но все равно происходила.
Иногда, правда, действительно, раньше чем наступала ошибка, заканчивалась память (происходило обращение по адресу 0xFFFFFFFF)
Я подумал, что уж если после всех проверок памяти все еще не хватает, то видимо ошибка зарыта не там где мы её ищем.

И действительно. Я нашел откуда появляется утечка памяти.
В функции MyReadFs для хранения и считывания информации о файле/директории использовалась структура AEEFileInfoEx (расширенная).
Её инициализация - занятие не из приятных и вообще на мой взгляд достаточно непонятное (хотя необходимое для того, чтобы IFILEMGR_EnumInit вернул SUCCESS). В общем я решил отказаться от нее и использовать просто AEEFileInfo.

После внесения этого изменения перестало возвращаться BPOINT 1 - то есть утечка памяти прекратилась.

Вот код, полностью рабочий. Здесь приведены функция MyReadFs и обработка нажатия кнопки SELECT:

Обработка нажатия кнопки SELECT:

Код:
case AVK_SELECT:

                    ind = IMENUCTL_GetSel( pMe->pIMenu );

                    if ( ind == 0  && STRCMP( pszDir, "fs:/") )
                    {
                        char* pszTmp = STRRCHR ( pszDir, '/');
                        IMENUCTL_DeleteAll ( pMe->pIMenu );
                        if ( pszTmp )
                        {
                            *pszTmp = '\0';
                               if ( *(pszDir + 3) == '\0' ) 
                            {
                                *(pszDir + 4) = '\0';
                                *(pszDir + 3) = '/';
                            };
                            MyReadFs( pMe, pszDir );
                            IMENUCTL_Redraw ( pMe->pIMenu );
                            IDISPLAY_Update ( pMe->pIDisplay );
                        };
                        return (TRUE);
                    };
                    if (IMENUCTL_GetItem ( pMe->pIMenu, ind, &pMe->getInfo) == TRUE)
                    {    
                        IMENUCTL_DeleteAll ( pMe->pIMenu );
                        //////
                        
                        FREEIF( pszDir );
                        pszDir = (char*)MALLOC( WSTRLEN( pMe->getInfo.pText ) + 1 );
                        if ( pszDir == NULL ) return (FALSE);

                        WSTRTOSTR ( pMe->getInfo.pText, pszDir, WSTRLEN( pMe->getInfo.pText ) + 1 );
                        //////
                        MyReadFs( pMe, pszDir );
                        IMENUCTL_Redraw ( pMe->pIMenu );
                        IDISPLAY_Update ( pMe->pIDisplay );
                        return (TRUE);
                    };
Функция MyReadFs:
Код:
static void MyReadFs (Browser* pMe, const char* pszBuf)
{
    static AEEFileInfo info;
    AECHAR szAEBuf[AEE_MAX_FILE_NAME];
    static IFileMgr* pIFileMgr = NULL;
    static AECHAR* szLevelUp = L"..";
    i = 0;
    ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_FILEMGR, (void*)&pIFileMgr);
    if ( i == 0 && STRCMP( pszBuf, "fs:/") ) 
        IMENUCTL_AddItem(pMe->pIMenu,NULL, 0, i++, szLevelUp,0);

    if ( IFILEMGR_EnumInit(pIFileMgr, pszBuf, TRUE) == SUCCESS )
    {
        while (IFILEMGR_EnumNext(pIFileMgr, &info))
        { 
        
            STRTOWSTR (info.szName, szAEBuf, AEE_MAX_FILE_NAME * sizeof(AECHAR));
            IMENUCTL_AddItem(pMe->pIMenu,NULL,0,i++, szAEBuf,0);
        }
    }

    if ( pIFileMgr != NULL )        
    {
        IFILEMGR_Release( pIFileMgr );  
        pIFileMgr = NULL;             
    }
};

Ошибка исправлена - дело сделано.

Спасибо, zevun, за то, что откликнулись и спасибо за помощь.
Ответить с цитированием
  (#15 (permalink)) Старый
zevun zevun вне форума
Member
 
Сообщений: 551
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.08.2007
По умолчанию 20.08.2008, 15:27

Цитата:
Спасибо, zevun, за то, что откликнулись и спасибо за помощь.
Пожалуйста.

Надо было мне сразу попросить Вас выложить код MyReadFs, а я, дурак, поверил Вам, что мол там всё впорядке.

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

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти ошибку в программном коде Leks100 C++ Builder 0 07.06.2011 05:18
Как найти ошибку в программном коде mbhamster DHTML, JavaScript, VBScript 2 30.03.2011 19:21
Как найти ошибку в программном коде Koten C++ Builder 3 16.11.2009 11:37
Как найти ошибку в программном коде Goose J2ME 4 04.05.2009 15:03
Как найти ошибку в программном коде tysya Delphi 2 04.04.2008 21:28
Как найти ошибку в программном коде nikolaya Lisp 0 07.03.2008 19:47
Как найти ошибку в программном коде Виталик 1 Delphi 8 14.08.2006 11:06
Как в программном коде найти ошибку Алексеев Николай Delphi 16 17.05.2006 12:43
Как найти ошибку в программном коде gip С/С++ 5 23.01.2006 00:30
Как найти ошибки в программном коде Regbist Assembler 6 04.05.2005 10:52
Как узнать что ошибка программы или же ошибка в программном коде Vasis Delphi 0 01.07.2004 16:09
Ошибка в программном коде Windows Anonymous Вопросы начинающих программистов 1 17.05.2004 02:22



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов