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

Начинающий си/си++ программист - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 127, средняя оценка - 4.69
sly444
 Аватар для sly444
5 / 5 / 1
Регистрация: 29.12.2010
Сообщений: 134
29.12.2010, 21:30     Начинающий си/си++ программист #1
Я вот собираюсь начать учить язык си а впоследствии си++. У меня есть книга Б.Керниган, Д.Ритчи "Язык программирования си". Мне нравится как там написано, да и отзывы об этом учебнике неплохие. У меня проблема с компиляторами, я не могу понять какой лучше закачал наконец DEV-C++ вроде отличный интерфейс, русский. Дошло до написания первой программы, написал как в учебнике написано, первый пример. Должна была получится программа, которая писала бы - Здравствуй мир, но компилятор почему то комментарий Здравствуй мир выделил красным цветом, я этому значения не придал, скомпилировал программу, и нажал на запуск. При запуске появляется окно на долю секунды и исчезает. В учебнике написано, что у них примеры для UNIX системы, для других систем - надо консультироваться со специалистами. Подскажите пожалуйста как писать на виндовсе. Буду также рад любой информации по языку си, так как я только начинающий. Заранее спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.01.2011, 01:35     Начинающий си/си++ программист #61
Да? Тогда я жажду объяснений в чем тут проблема, кроме того что после push_back адреса становятся другие.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <vector>
#include <iostream>
 
template<class T>
T* returnAddr(T& one)
{
    return &one;
}
 
int main()
{
    std::vector<std::string> vec;
    vec.push_back(std::string("1"));
    vec.push_back(std::string("2"));
    std::cout<<returnAddr(vec[0])<<'\n';
    std::cout<<returnAddr(vec[1])<<'\n';
    vec.push_back(std::string("3"));
    std::cout<<returnAddr(vec[0])<<'\n';
    return 0;
}
Добавлено через 1 минуту
Да и без функции я жажду объяснения трудности взятия адреса...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <vector>
#include <iostream>
 
int main()
{
    std::vector<std::string> vec;
    vec.push_back(std::string("1"));
    vec.push_back(std::string("2"));
    std::cout<<&vec[0]<<'\n';
    std::cout<<&vec[1]<<'\n';
    vec.push_back(std::string("3"));
    std::cout<<&vec[0]<<'\n';
    return 0;
}
Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <vector>
#include <iostream>
 
int main()
{
    std::vector<std::string> vec;
    vec.push_back(std::string("1"));
    vec.push_back(std::string("2"));
    std::cout<<&vec[0]<<'\n';
    std::cout<<&vec[1]<<'\n';
    vec.push_back(std::string("3"));
    std::cout<<&vec[0]<<'\n';
    vec.push_back("10");
    std::cout<<&vec[0]<<'\n';
    std::cout<<"\n\n\n";
    for(size_t i=0; i<vec.size(); ++i)
        std::cout<<&vec[i]<<'\n';
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.01.2011, 01:39     Начинающий си/си++ программист #62
Как Вы не можете понять у вас "1" и "2" это константы, их адреса известны компилятору. Это и объясняет исполнимость кода.
А у меня есть строка p, которая появляется в памяти программы В ПРОЦЕССЕ ЕЁ ВЫПОЛНЕНИЯ. Прогамма считывает текстовый файл в строку (кстати, мой код: myklass>> stroka)

Потом пишется так:
C++
1
char* p= stroka.c_str();
После этого идёт обработка строки. (фактически обработка текстового файла) И в не
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.01.2011, 01:39     Начинающий си/си++ программист #63
В процессе выполнения.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <vector>
#include <iostream>
#include <string>
 
int main()
{
    std::vector<std::string> vec;
    char Arr[20];
    std::cin.getline(Arr, 19);
    vec.push_back(Arr);
    std::string str;
    std::getline(std::cin, str);
    vec.push_back(str);
    std::cout<<&vec[0]<<'\n';
    std::cout<<&vec[1]<<'\n';
    std::cout<<vec[0]<<'\n';
    std::cout<<vec[1]<<'\n';
    return 0;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.01.2011, 01:40     Начинающий си/си++ программист #64
й толькО НА ЭТОЙ стадии становятся известны все адреса.
А в приведённых Вами примерах адреса "1" и "2" известны заранее, я повторяюсь уже. Чуть посложнее надо примеры брать.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.01.2011, 01:41     Начинающий си/си++ программист #65
kravam, Ну написал чуть посложнее. Я могу тонну примеров написать, во всех адреса легко берутся. По-моему я это уже продемонстрировал. Надо просто правильно работать с классом. Вам считывание из файла написать и показать что и тогда адреса легко берутся, или как?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.01.2011, 01:41     Начинающий си/си++ программист #66
О! Уже лучше. А мне getline вобще претит. Я не знаю заранее размер буфера. Такие дела.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.01.2011, 01:43     Начинающий си/си++ программист #67
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <vector>
#include <iostream>
#include <string>
 
int main()
{
    std::vector<std::string> vec;
    std::string str;
    std::getline(std::cin, str);
    vec.push_back(str);
    char* ptr=const_cast<char*>(str.c_str());
    vec.push_back(ptr);
    std::cout<<&vec[0]<<'\n';
    std::cout<<&vec[1]<<'\n';
    std::cout<<vec[0]<<'\n';
    std::cout<<vec[1]<<'\n';
    return 0;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.01.2011, 01:44     Начинающий си/си++ программист #68
И опять же в приведённом вами примере в вектор кладётся Arr. Да этот заполняется в ходе выполнения программыю Но его адрес известен заранее.
C++
1
char Arr[20];
silent_1991
14.01.2011, 01:45
  #69

Не по теме:

Балин, толстый тролль такой толстый...

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.01.2011, 01:46     Начинающий си/си++ программист #70
kravam, Выше пример посмотрите) По-моему ничем не отличается от вашего. Кроме того что такой код.

C++
1
char* ptr=stroka.c_str();
не проходит компиляцию в MSVS, ибо константный char* пытаемся присвоить обычному. Нехорошо.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.01.2011, 01:51     Начинающий си/си++ программист #71
И в последнем примере в вектор кладутся адреса, известные заранее. ДЕЙСТВИТЕЛЬНО:
C++
1
vec.push_back(str);
Так а у нас str уже объявлена
C++
1
vec.push_back(ptr);
Ну помня, как мы нашли ptr (через известную ЗАРАНЕЕ str)
В общем мне нечего сказать больше. ВСе всё видят.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.01.2011, 01:54     Начинающий си/си++ программист #72
kravam, Эм. А ваш код чем-то отличается? оО

C++
1
2
mystream >> stroka;
char* p=stroka.c_str();
Это что же, размер и адрес stroka не известен по-вашему? оО.
Через getline аналогично. Все происходит только в процессе выполнения программы и никак не на этапе компиляции.
Опять же отличие только в том, что использована неверная синтаксическая конструкция, это опасная и неверная конструкция я бы даже сказал.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.01.2011, 01:57     Начинающий си/си++ программист #73
Предлагаю пока на этом остановиться. Дело в том, что я НЕ ХОЧУ использовать getline при считывании из файла. Не для того я столько времени пыхтел над кодингом чтобы вручную выделять память И не использую. А поэтому не изучил её параметров.
Вместо этого я написал свой класс, присоединяю его и пишу так:

C++
1
2
3
myfstream f ("file.txt");
string str;
f>> str;
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.01.2011, 01:58     Начинающий си/си++ программист #74
kravam, Да пожалуйста. Кто против? НО вы правда думаете, что после этого размер строки и ее адрес неизвестны компилятору????
П.С. для использования getline не нужно заранее выделять память=)
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.01.2011, 02:04     Начинающий си/си++ программист #75
Ну на счёт приведения типов сполрю не буду, я быдлокодер. А вот про p скажу- адрес строки на которую он указывает ЗАРАНЕЕ НЕИЗВЕСТЕН
C++
1
2
3
4
5
6
7
 myifstream myf ("log.txt");
 string stroka;
 myf>>stroka; 
 
 
 char* p;
 p= (char*)stroka.c_str();
И помня, что строка эта считывается из текстового файла, а он каждый раз вообще разный и строка эта обрабатывается и элементы vector<string> есть суть подстроки p- в общем их адреса и размеры заранее тоже неизвестны.

Добавлено через 2 минуты
А нет, тут я пожалуй соврал. Я не знаю реализации str.c_str() Но я могу ошибаться только в том, звестно ли заранее компилятору размер и адрес стрки, это да.

Но ещё раз: Строка разбивается на подстроки. И вот они-то точно неизвестны компилятору. А они и есть элементы vector<string>
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.01.2011, 02:04     Начинающий си/си++ программист #76
kravam, Вы крайне интересный человек. Расскажите мне разницу между вашим считыванием из файла и считыванием из потока? Там тоже размер строки всегда разный и неизвестен. А вот с хрена-ли адрес p вдруг становится неизвестным?)
Тааак... Ладно. Сейчас приведу пример. Не пишите пока)
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.01.2011, 02:10     Начинающий си/си++ программист #77
НА счёт getline- у меня учебник Павловской, так там три параметра нормально так расписаны. Второй- количество символов, сколько надо считать. А первый буфер. Значит, вручную следим за переполнением.

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
А вот с хрена-ли адрес p вдруг становится неизвестным?)
я ошибся, я написал выше, p известен заранее.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.01.2011, 02:10     Начинающий си/си++ программист #78
Пример. И указатели. И вектор. И парсинг строки. И везде запросто берутся адреса.

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
#include <vector>
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
 
int main()
{
    std::string str;
    std::getline(std::cin, str);
    std::cout<<&str<<'\n';
    std::cout<<str<<'\n';
    char* p=const_cast<char*>(str.c_str());
    std::cout<<&p<<'\n';
    std::cout<<p<<'\n';
 
    std::vector<std::string> vec;
    std::string tmp;
    std::istringstream ist(str);
    while(ist >> tmp)
        vec.push_back(tmp);
    std::cout<<"\n\n\n";
    for(size_t i=0; i<vec.size(); ++i)
    {
        std::cout<<&vec[i]<<'\n';
        std::cout<<vec[i]<<'\n';
    }
    return 0;
}
П.С. у getline есть глобальная версия для класса string, которую я в основном и использую. И в этом коде тоже
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.01.2011, 02:17     Начинающий си/си++ программист #79
НЕ пойдёт и вот почему, но сперва вопрос:
Я если правильно понял, ваш код считывает строку а потом её разбивает на подстроки, где разделители - пробельные символы и каждую из таких подстрок запихивает в vector<string>, так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2011, 02:19     Начинающий си/си++ программист
Еще ссылки по теме:

C++, <fstream>, начинающий, ошибка на выполнении C++
Начинающий программист C++
Начинающий, посоветуйте, с чего начать? C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.01.2011, 02:19     Начинающий си/си++ программист #80
kravam, Так. Можно поставить любой разделитель. Вообщем можно как захочется распарсить строку - запихнуть в вектор и каждый адрес строки просто или как элемента вектора - будет запросто браться.
Yandex
Объявления
14.01.2011, 02:19     Начинающий си/си++ программист
Ответ Создать тему
Опции темы

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