Форум программистов, компьютерный форум CyberForum.ru

Вывод результата на экран - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
zewer
 Аватар для zewer
1019 / 710 / 71
Регистрация: 07.01.2011
Сообщений: 5,365
20.04.2012, 23:58     Вывод результата на экран #1
Всем привет, нуждаюсь в помощи!
Написал прогу, она еще не на 100% готова, но при прекопиляции дает ошибку в последних 2 строках кода

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <conio.h>
#include "iostream"
#include "fstream"
using namespace std;
 
struct List
{
    char ar[100];
};
 
void main ()
{
    setlocale (LC_ALL,"Ukrainian");
    List *l;
    int h;
    int key = 0;
    int tmp;
    int m = 37;
    char *ar[37];
    ifstream in("C:\\data.txt",ios::in);
    cout << "\t\t\tХеш-таблиця № 1\n";
 
    while(!in.eof())
    {
        cout << "\n\n";
        l = new List [100];
        in >> l->ar;
        cout << "Зчитане слово: " << l->ar;
        while ( l->ar[key] != NULL )
            key++;
        cout << "\nСлово (ключ) мiстить " << key << " слiв\n";
        h = (7*key)%37;
        cout << "\th(key) = " << h << "\n\n";
        if (ar[h] == NULL)
        {
            ar[h] = l->ar;
            cout << "\tСлово занесено у хеш-таблицю\n";
        }
        else
        {
            cout << "Слово не може бути занесеним у хеш-таблицю, оскiльки виявлено колiзiю\n";
        }
        key = 0;
    }
    in.close();
    for (int i = 0; i < m; i++)           /// сдесь ошибка
        cout << *ar[i];         //// сдесь ошибка
}
помогите правильно виводить масив, в котором в будущем при обработке входной инфы будет результат

Коротко по програме:
Вх данные местяться в data.txt , я их копирую в прогу, работаю с ними, по формуле делаю хеш-таблицу, и в масиве ar[i] будет меститься сама таблица, но при виводе на экран - прога получает crash, помогите пжл)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2012, 23:58     Вывод результата на экран
Посмотрите здесь:

некорректный вывод результата C++
не правильный вывод результата C++
C++ ввод и вывод результата в файл
Вывод результата C++
C++ Вывод результата
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
21.04.2012, 02:36     Вывод результата на экран #2
Замени
C++
1
char *ar[37];
На
C++
1
std::vector<std::string> ar(37);
Легче работать будет

Добавлено через 2 минуты
И подозремваю что должно работать так
C++
1
 for (int i = 0; i < m; i++) cout << ar[i];
zewer
 Аватар для zewer
1019 / 710 / 71
Регистрация: 07.01.2011
Сообщений: 5,365
21.04.2012, 16:31  [ТС]     Вывод результата на экран #3
есть звездочка или нет, ошибка выбивает все и одно, не могли бы вы ее прокомпилировать у себя на компьютере?
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
21.04.2012, 17:52     Вывод результата на экран #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <conio.h>
#include <iostream>          // Вот так правильно объявлять!
#include <fstream>                
using namespace std;
 
struct List
{
    char ar[100];
};
//---------------------------------------------------------------------------
 
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
 system("chcp 1251");
 
    List *l;
    int h;
    int key = 0;
    int tmp;
    int m = 37;
    char *ar[37];
    ifstream in("1.txt",ios::in); // вставил свой файл со всякой фигней
    cout << "\t\t\tХеш-таблиця № 1\n";
 
    while(in && !in.eof())  // Что если файл не открыт?
    {
        cout << "\n\n";
        l = new List [100];
        in >> l->ar;
        cout << "Зчитане слово: " << l->ar;
        while ( l->ar[key] != NULL )
            key++;
        cout << "\nСлово (ключ) мiстить " << key << " слiв\n";
        h = (7*key)%37;
        cout << "\th(key) = " << h << "\n\n";
        if (ar[h] == NULL)
        {
            ar[h] = l->ar;
            cout << "\tСлово занесено у хеш-таблицю\n";
        }
        else
        {
            cout << "Слово не може бути занесеним у хеш-таблицю, оскiльки виявлено колiзiю\n";
        }
        key = 0;
           delete l; // Надо удалить!!!
    }
    in.close();
    for (int i = 0; i < m; i++)
        cout << *ar[i];
return 0;
}
//---------------------------------------------------------------------------
Текст файла "1.txt"
1dfdgfgfg
2gfgfgfg
3gfg
dfdfdf

Результат
Миниатюры
Вывод результата на экран  
Xavier
in god we trust
 Аватар для Xavier
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
21.04.2012, 18:09     Вывод результата на экран #5
Не знаю это у тебя только тут опечатка или и в компиляторе ты так пишешь но у тебя в функции main возвращаемое заначение стоит void а должно int
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
21.04.2012, 18:20     Вывод результата на экран #6
Xavier, это непринципиально, зависит от компилятора
Xavier
in god we trust
 Аватар для Xavier
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
21.04.2012, 18:28     Вывод результата на экран #7
Не у тебя
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void main ()
{
    setlocale (LC_ALL,"Ukrainian");
    List *l;
    int h;
    int key = 0;
    int tmp;
    int m = 37;
    char *ar[37];
    ifstream in("C:\\data.txt",ios::in);
    cout << "\t\t\tХеш-таблиця № 1\n";
//...
}
Добавлено через 5 минут
Цитата Сообщение от Avazart Посмотреть сообщение
Xavier, это непринципиально, зависит от компилятора
Но это не соответствует стандарту насколько я знаю, следовательно у него могут возникнуть проблемы при переносе кода
zewer
 Аватар для zewer
1019 / 710 / 71
Регистрация: 07.01.2011
Сообщений: 5,365
21.04.2012, 18:28  [ТС]     Вывод результата на экран #8
не совсем понимаю как вы создавали проект, но мой компилятор VS 2010 ругаеться на
C++
1
int _tmain(int argc, _TCHAR* argv[])
я всегда беру ф-ию void main , поскольку она мне ничего не возвращает, зачем туда инт писать?

и так проблема все еще актуальна

я в мейне использовал указатель, из за того, что у меня такая ошибка:

вот в коде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <conio.h>
#include <iostream>          // Вот так правильно объявлять!
#include <fstream>                
using namespace std;
 
struct List
{
    char ar[100];
};
//---------------------------------------------------------------------------
 
int main()
{
    setlocale (LC_ALL,"Ukrainian");
    //system("chcp 1251");
    List *l;
    int h;
    int key = 0;
    int tmp;
    int m = 37;
    char ar[37];
    for (int i = 0; i < m; i++)
        ar[i] = NULL;
    ifstream in("C:\\data.txt",ios::in); // вставил свой файл со всякой фигней
    cout << "\t\t\tХеш-таблиця № 1\n";
 
    while(in && !in.eof())
    {
        cout << "\n\n";
        l = new List [100];
        in >> l->ar;
        cout << "Зчитане слово: " << l->ar;
        while ( l->ar[key] != NULL )
            key++;
        cout << "\nСлово (ключ) мiстить " << key << " слiв\n";
        h = (7*key)%37;
        cout << "\th(key) = " << h << "\n\n";
        if (ar[h] != NULL)
        {
            ar[h] = l->ar;    // здесь проблема, из за невозможной операции char* и char
            cout << "\tСлово занесено у хеш-таблицю\n";
        }
        else
        {
            cout << "Слово не може бути занесеним у хеш-таблицю, оскiльки виявлено колiзiю\n";
        }
        key = 0;
        delete l;
    }
    in.close();
    for (int i = 0; i < m; i++)
        cout << ar[i];
    return 0;
}


мб помогите решить такую тогда проблему)
Xavier
in god we trust
 Аватар для Xavier
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
21.04.2012, 18:33     Вывод результата на экран #9
Цитата Сообщение от zewer Посмотреть сообщение
я всегда беру ф-ию void main , поскольку она мне ничего не возвращает, зачем туда инт писать
На будущее использую лучше int main(). По стандарту С++ функция main должна возвращать значение только типа int. Это уже некоторые компиляторы разрешают возвращать void.

у меня в QT твой код запустился но программа вылетает.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
21.04.2012, 18:34     Вывод результата на экран #10
C++
1
 ar[h] = l->ar;
А что тут должно происходить?
zewer
 Аватар для zewer
1019 / 710 / 71
Регистрация: 07.01.2011
Сообщений: 5,365
21.04.2012, 18:45  [ТС]     Вывод результата на экран #11
Цитата Сообщение от Xavier Посмотреть сообщение
На будущее использую лучше int main(). По стандарту С++ функция main должна возвращать значение только типа int. Это уже некоторые компиляторы разрешают возвращать void.

у меня в QT твой код запустился но программа вылетает.
в 2 последних рядках ошибка, запусти в пошаговом режиме, или постав брейк пойнт перед последним циклом с выводом масива ar[]

Добавлено через 9 минут
ладно, дам обьяснение по проге:
у меня в файле меститься вот такая инфа:
Kutaev Olexandr Valentynovych 3 7 1993 Kyivstar 0 6 7 1 8 8 9 3 2 8 Lvivska Lviv Tychyny 13 3 IKTA EOM KI-23 21 4 2012
это моя вх последовательность слов (ну типа слова и цифри, но все это будем называть просто - слова), у меня по алгоритму делаеться вычисление к-ва букв в слове(ну или цифр в числах).
Потом по формуле: h = (7*key)%37; где key - к-во этих самых букв (цифр) и запихать в масив под номером h, данное слово. Например:
Kutaev - 6 букв, по формуле h = (7*6)%37 = 42%37 = 5
т.е. в масиве ar[] должно меститься слово Kutaev под номером 6, и когда я вконце пытаюсь вивести масив на экран, у меня происходит crash в проге из за неправильного исполтзования указателей "*", а как подругому сделать без них, я не очень знаю, и что то не получалось.

А причем здесь void main или int main не шарю))))
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
21.04.2012, 18:47     Вывод результата на экран #12
А причем здесь void main или int main не шарю))))
К соблюдению по возможности стандарта, вместо выдумывания отсебячины
zewer
 Аватар для zewer
1019 / 710 / 71
Регистрация: 07.01.2011
Сообщений: 5,365
21.04.2012, 18:47  [ТС]     Вывод результата на экран #13
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
 ar[h] = l->ar;
А что тут должно происходить?
по адресу l->ar храниться мое слово, которое я узял из файла, и потом я подсчитал его номер, и рядком
C++
1
ar[h] = l->ar;
запихаю слово в масив под номер h
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
21.04.2012, 18:51     Вывод результата на экран #14
запихаю
Если подразумевается копирование, то это и не должно работать.
zewer
 Аватар для zewer
1019 / 710 / 71
Регистрация: 07.01.2011
Сообщений: 5,365
21.04.2012, 18:54  [ТС]     Вывод результата на экран #15
Цитата Сообщение от Avazart Посмотреть сообщение
Если подразумевается копирование, то это и не должно работать.
ну типо да, перемещаю из масива ar[100](он в структуре висит) в масив ar[], после чего в масив ar[100](он в структуре висит) опять копирую следующее слово из файла, и так далее, аж к концу файла
Xavier
in god we trust
 Аватар для Xavier
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
21.04.2012, 18:56     Вывод результата на экран #16
ты пишешь в начале char *ar[37]; это ты создаешь массив указателей а не строку

а в этом коде:
Цитата Сообщение от zewer Посмотреть сообщение
Код C++
1
ar[h] = l->ar;
запихаю слово в масив под номер h
ты указываешь этим указателем на эту строку т.е. присваиваешь указателю с индексом[h] из массива указателей адрес строки если я все правильно понял

так вот попробуй в конце там где у тебя ошибка написать
C++
1
2
or (int i = 0; i < m; i++)           /// сдесь ошибка
        cout << (*ar)[i];
вот так
у меня заработало после этого
zewer
 Аватар для zewer
1019 / 710 / 71
Регистрация: 07.01.2011
Сообщений: 5,365
21.04.2012, 19:05  [ТС]     Вывод результата на экран #17
Цитата Сообщение от Xavier Посмотреть сообщение
ты пишешь в начале char *ar[37]; это ты создаешь массив указателей а не строку

а в этом коде:

ты указываешь этим указателем на эту строку т.е. присваиваешь указателю с индексом[h] из массива указателей адрес строки если я все правильно понял

так вот попробуй в конце там где у тебя ошибка написать
C++
1
2
or (int i = 0; i < m; i++)           /// сдесь ошибка
        cout << (*ar)[i];
вот так
у меня заработало после этого
у меня ничего. Еще меня беспокоит одна проблема, у меня в строках:
C++
1
2
3
4
5
        if (ar[h] == NULL)
        {
            ar[h] = l->ar; // ошибка 
            cout << "\tСлово занесено у хеш-таблицю\n";
        }
проха не заходит в if, т.е. наверное надо брать не char *ar[37]; а char ar[37]; потомучто в масиве походу не будет даже данных
но тогда в :
C++
1
ar[h] = l->ar;
будет ошибка

попробуй вот такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <conio.h>
#include "iostream"    //////        Варіант:
#include "fstream"     /////    Хеш-ф-ія: 12.   h(key) = [7*(кількість символів в ключі)] % 37;
using namespace std;   /////    Колізія: 14.    методом рехешування з функцією повторного хешування 
                       /////    hi(key) = ( h(key) + p • i^2 ) % m ,  
//#define m 37           /////    де p – послідовність випадкових цілих чисел: p1 = 2, р2 = 5, p3 = 1, р4 = 3,  ... (за потребою, продовжити цей ряд);
 
struct List
{
    char ar[100];
};
int main ()
{
    setlocale (LC_ALL,"Ukrainian");
    List *l;
    int h;
    int key = 0;
    char ar[37];
    ifstream in("C:\\data.txt",ios::in);
    cout << "\t\t\tХеш-таблиця № 1\n";
 
    while(in && !in.eof())
    {
        cout << "\n\n";
        l = new List [100];
        in >> l->ar;
        cout << "Зчитане слово: " << l->ar;
        while ( l->ar[key] != NULL )
            key++;
        cout << "\nСлово (ключ) мiстить " << key << " слiв\n";
        h = (7*key)%37;
        cout << "\th(key) = " << h << "\n\n";
        if (ar[h] == NULL)
        {
            ar[h] = l->ar; // ошибка 
            cout << "\tСлово занесено у хеш-таблицю\n";
        }
        else
        {
            cout << "Слово не може бути занесеним у хеш-таблицю, оскiльки виявлено колiзiю\n";
            //while (  );
        }
        key = 0;
    }
    in.close();
    for(int i = 0; i < 36; i++)           /// сдесь ошибка
        cout << ar[i];
    return 0;
}
Xavier
in god we trust
 Аватар для Xavier
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
21.04.2012, 19:09     Вывод результата на экран #18
Цитата Сообщение от zewer Посмотреть сообщение
ar[h] = l->ar; // ошибка
конечно ошибка теперь ты создаешь одну строку char ar[37] а потом этим кодом пытаешься запихнуть
в ar[h] (т.е. отдельный 37-ой символ ) целую строку
zewer
 Аватар для zewer
1019 / 710 / 71
Регистрация: 07.01.2011
Сообщений: 5,365
21.04.2012, 19:12  [ТС]     Вывод результата на экран #19
Цитата Сообщение от Xavier Посмотреть сообщение
конечно ошибка теперь ты создаешь одну строку char ar[37] а потом этим кодом пытаешься запихнуть
в ar[h] (т.е. отдельный 37-ой символ ) целую строку
а как сделать чтоб был масив строк? и по выбраном № строки (тоесть по номере h) и пхать туда слово?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2012, 19:18     Вывод результата на экран
Еще ссылки по теме:

Вывод результата поиска C++
C++ Вывод результата
Вывод дробного результата C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Xavier
in god we trust
 Аватар для Xavier
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
21.04.2012, 19:18     Вывод результата на экран #20
for(int i = 0; i < 36; i++) /// сдесь ошибка
cout << (*ar)[i];
интересно почему у тебя не работает такой вариант потому что создав массив указателей char *ar[37] и указывая отдельным указателем из этого массива на строку ты получаешь массив строк.

Еще есть вариант создать двумерный массив это тоже будет массив строк ar[нужное кол-во строк][37]

У меня вот такой код запускается и не вылетает

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <conio.h>
#include <iostream>
#include <fstream>
using namespace std;
 
struct List
{
    char ar[100];
};
 
int main ()
{
    setlocale (LC_ALL,"Ukrainian");
    List *l;
    int h;
    int key = 0;
    int tmp;
    int m = 37;
    char *ar[37];
    ifstream in("data.txt",ios::in);
    cout << "\t\t\tХеш-таблиця № 1\n";
 
    while(!in.eof())
    {
        cout << "\n\n";
        l = new List [100];
        in >> l->ar;
        cout << "Зчитане слово: " << l->ar;
        while ( l->ar[key] != NULL )
            key++;
        cout << "\nСлово (ключ) мiстить " << key << " слiв\n";
        h = (7*key)%37;
        cout << "\th(key) = " << h << "\n\n";
        if (ar[h] == NULL)
        {
            ar[h] = l->ar;
            cout << "\tСлово занесено у хеш-таблицю\n";
        }
        else
        {
            cout << "Слово не може бути занесеним у хеш-таблицю, оскiльки виявлено колiзiю\n";
        }
        key = 0;
    }
    in.close();
    for (int i = 0; i < m; i++)           
        cout << (*ar)[i];         
}
Yandex
Объявления
21.04.2012, 19:18     Вывод результата на экран
Ответ Создать тему
Опции темы

Текущее время: 09:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru