Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу откомпилировать, Ошиька линкера 
:(
    Опции темы
Dufrense
Дата 18.8.2005, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.8.2005

Репутация: нет
Всего: нет



Не могу откомпилировать следующий код:
Код

#include <stdio.h>
#include <string.h>

#define MAXLINES 5000 /* максимальное количество строк */

char *lineptr[MAXLINES]; /* указатели на строки */

int readlines(char *linptr[], int nlines);
void writelines(char lineptr[], int nlines);
void qsort(char *linptr[], int left, int right);

/* сортировка строк */

int main()
{
    int nlines; /* количество прочитанных строк */

    if((nlines = readlines(lineptr, MAXLINES)) >= 0) 
    {
        qsort(lineptr,0,nlines-1);
        writelines(*lineptr,nlines);
        return 0;
    }
    else 
    {
        printf("Error: too many strings\n");
        return 1;
    }
}

#define MAXLEN 1000 /* максимальная длина строки */

int getline(char *, int);
char *alloc(int);

/* readlines: чтение строк */
int readlines(char *lineptr[], int maxlines)
{
    int len, nlines;
    char *p, line[MAXLEN];

    nlines = 0;
    while((len = getline(line, MAXLEN)) > 0)
        if((nlines >= maxlines) || ((p = alloc(len)) == NULL))
            return -1;
        else
        {
            line[len-1] = '\0'; /* убираем символ \n */
            strcpy(p,line);
            lineptr[nlines++] = p;
        }

        return nlines;
}

/* writelines: печать строк */
void writelines(char *lineptr[], int nlines)
{
    while(nlines-- > 0)
        printf("%s\n",*lineptr++);
}

/* qsort: сортирует v[left]...v[right] по возрастанию */
void qsort(char *v[], int left, int right)
{
    int i, last;
    void swap(char *v[], int i, int j);


    if (left >= right) /* ничего не делается, если в массиве */
        return;        /* менее двух элементов */

    swap(v, left, (left+right)/2);
    last = left;
    for(i = left+1; i <= right; i++)
        if (strcmp(v[i], v[left]) < 0)
            swap(v, ++last, i);
    swap(v, left, last);
    qsort(v, left, last-1);
    qsort(v, last+1, right);
}


/* swap: поменять местами v[i] и v[j] */
void swap(char *v[], int i, int j)
{
    char *temp;
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}


Компилятор выдает следующее:

Linking...
main.obj : error LNK2001: unresolved external symbol "void __cdecl writelines(char * const,int)" (?writelines@@YAXQADH@Z)
main.obj : error LNK2001: unresolved external symbol "char * __cdecl alloc(int)" (?alloc@@YAPADH@Z)
main.obj : error LNK2001: unresolved external symbol "int __cdecl getline(char *,int)" (?getline@@YAHPADH@Z)
Debug/myproject.exe : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.

В чем состоят ошибки?


PM MAIL   Вверх
maxim1000
Дата 18.8.2005, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



попробуй заменить
Код

writelines(*lineptr,nlines);

на
Код

writelines(lineptr,nlines);

smile


--------------------
qqq
PM WWW   Вверх
avek
Дата 18.8.2005, 13:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ошибки состоят в том, что функций, на которые линкер ругается, в программе просто нигде нет...
  Вверх
Artiom
Дата 18.8.2005, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



заголовок функции в объявлении
Код

void writelines(char lineptr[], int nlines);


не совпадает с заголовком в реализации
Код

void writelines(char *lineptr[], int nlines)


Это сообщение отредактировал(а) Artiom - 18.8.2005, 14:39


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
Orlan
Дата 18.8.2005, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 10.6.2004
Где: Киев

Репутация: нет
Всего: 1



Для избежания подобных проблем в будущем я бы заменил декларации функций на их реализации
--------------------
А вы знали, что терапевт - это 1024 гигапевта или 1048576 мегапевтов
PM MAIL   Вверх
mr.Anderson
Дата 18.8.2005, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Так не очень красиво получится, на мой взгляд.
А прототип и реализация, конечно, должны совпадать обязательно. Однако, в некоторых учебниках говорится, что можно объявить прототип так:
Код

bool func(int,char,int);

А функцию реализовать, например, так:
Код

bool func(int a,char b,int rezult)
{
}



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Void
Дата 18.8.2005, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(sim7 @ 18.8.2005, 20:58)
Однако, в некоторых учебниках говорится, что можно объявить прототип так:

Можно. Сигнатуры функций здесь ничем не отличаются. Однако я бы предпочел выписывать полные имена аргументов везде - в помощь автподсказке IDE и генераторам документации.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
mr.Anderson
Дата 18.8.2005, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Кстати, да. О том, как будет выглядеть подсказка при вызове, я как-то не подумал. smile


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Dufrense
Дата 19.8.2005, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.8.2005

Репутация: нет
Всего: нет



Спасибо, помогли. Особенно avek.
Ошибки заключались в том что объявление функции writelines не совпадало с реализацией. И
Цитата(avek @ 18.8.2005, 13:49)
в том, что функций, на которые линкер ругается, в программе просто нигде нет...


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1116 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.