2013-04-23 2 views
-2

Я сделал телефонная книга программа в C (с динамическими структурами и т. д.).C программа - работает в Linux; Сбой при запуске в окнах

Он отлично работает под Linux, но когда я пытаюсь запустить его (после компиляции в devC++), в Windows он запускается нормально, но после добавления некоторых данных в список он просто останавливается и завершает работу. То, что происходит только добавлением новых данных в телефонную книгу. Когда я работаю с другими функциями, это нормально, никаких прерываний и так далее.

В начале модуля я приложил windows.h и conio.h для getch() и systen("cls"). Возможно, я использовал некоторые функции, которые не разрешены в Windows или что-то подобное.

Это мой первый c-проект, и, как правило, я работаю в Linux, так что я должен соблюдать?

/*SCREEN*/ 
#ifdef __WIN32__           /*for Windows*/ 
#include<windows.h> 
#define GETCH printf("press ENTER...\n");getch() 
#define CLEAR system("cls") 
#endif 
#ifdef __unix__            /*for unix*/ 
#include<unistd.h> 
#define GETCH printf("\n\npress ENTER...");getchar() 
#define CLEAR system("clear") 
#endif 

Я также добавить имя и pnonenumber так же

printf("++ ADD DATA: ++\n"); 
     /*LASTNAME*/ 
       printf(">> add lastname : "); 
       fgets(buf,128,stdin); 
       lastname = malloc(strlen(buf));  /*allocate memory for lastdane*/ 
       if(lastname != NULL)    /*successful allocation*/ 
       { 
        strcpy(lastname, buf);   /*copy data from buf to lastname variable*/ 
        lastname[strlen(lastname)-1]='\0';/*get the number of elements and add '\0' at the end*/ 
       } 
       else        /*allocation failed*/ 
       { 
        printf("Memory Allocation Error!"); 
       } 
       memset(buf,0,128);  

void AddDATAsorted(char* lastname, char* firstname, char* telnumber) 
{ 
    tDATA* pDATA; 

    if(pTELBOOK) 
    { 
     pDATA = malloc(sizeof(tDATA));   /*allocate memory for new item*/ 

     pDATA->lastname = lastname;  
     pDATA->firstname = firstname; 
     pDATA->telnumber = telnumber; 

     addItemToList(pTELBOOK, pDATA, fcmp); /*add a new item sorted - see list.c*/ 
    } 
} /*END 6*/ 

ИТС в другом модуле.


int fcmp(void* pItemList, void* pItemNew) 
{ 
    tDATA* pDATA_list; 
    tDATA* pDATA_new; 
    int diff; 

    if(pItemList != NULL) 
    { 
     pDATA_list = (tDATA*) pItemList;   /*because void-pointer */ 
     pDATA_new = (tDATA*) pItemNew; 

     diff = strcmp(pDATA_list->lastname, pDATA_new->lastname); 
     if(diff != 0) return diff; 
     else          /*if items have the same lastname*/          
     { 
      diff = strcmp(pDATA_list->firstname, pDATA_new->firstname); 
      if(diff != 0) return diff; 
      else         /*if items have also the same firstname*/ 
      { 
       diff = strcmp(pDATA_list->telnumber, pDATA_new->telnumber); 
       if(diff != 0) return diff; 
       else return FAIL;     /*if items - equal*/ 
      } 
     } 
    } 
    else return OK; 

отладчик всегда показывает, что здесь не так л ...

/* 2 * Функция: удаление данных */

int RemoveDATA(void) 
{ 
    tDATA* pDATA = NULL; 
    if(pTELBOOK == NULL) return FAIL;  
    else          /*if pTELBOOK's current element - not empty - free allocated memory*/ 
    { 
    if(pTELBOOK->pCurr != NULL) 
    { 
      pDATA = pTELBOOK->pCurr->pItem; 
      free(pDATA->lastname); 
      free(pDATA->firstname); 
      free(pDATA->telnumber); 
      free(pTELBOOK->pCurr->pItem); 
      RemoveItem(pTELBOOK);   /*and remove element from the list*/ 
      return OK;       
    } 
    } 
} /*END 2*/ 
+5

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

+1

Запустите программу под отладчиком, чтобы вы могли следить за тем, что она делает? – stijn

+2

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

ответ

5
   lastname = malloc(strlen(buf)); /* problem */ 
      if(lastname != NULL) 
      { 
       strcpy(lastname, buf); 
       lastname[strlen(lastname)-1]='\0'; 
      } 

использование strdup. длина фамилии одна короче, чем необходимо. Это может быть проблемой:

 lastname = strdup(buf); 

Кроме того, вы не должны использовать 128 или что-то еще. Используйте sizeof buf или sizeof (buf) вместо этого, или, возможно, определить:

   #define BUF_SIZE 128 

Я не проверил остальные.

+0

С некоторыми флагами оптимизации, '-O2', это, вероятно, завершится неудачей на linux, а затем ... – anishsane

+0

, но эта программа работает так хорошо в Linux ... почему это не в Windows ... –

+0

конечно.Я думаю (но, может быть, и ошибаюсь) кажется безопасным, потому что malloc округляет запрошенную длину, так что куча, выделенная для реального, часто длиннее длины строки + 1 - способ сохранения памяти malloc actualy для процесса может иметь значение. Но это гипотеза: может быть, ваша программа на авариях окон в другом месте! Проверьте это с помощью отладчика (хотя это не означает, что это не ошибка в коде: это означает, что могут быть другие ошибки ...) – ShinTakezou

Смежные вопросы