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

Подскажите почему указатель работает неправильно? - C++

Восстановить пароль Регистрация
 
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
05.10.2013, 21:44     Подскажите почему указатель работает неправильно? #1
Вот код:
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
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <vector>
using namespace std;
void fn_pointer(char *ptr_array)
{
     for(int j=0;j<10;++j)
     {
       for(int i=0;i<10;++i)
       {
           cout<<*ptr_array++;
     }
       cout<<endl;
   }
}
int main()
{
   srand(time(NULL));
   vector <string> vec;
   string str;
   int i,j;
   char *ptr_array;
   for(j=0;j<10;++j)
   {
       for(i=0;i<10;++i)
       {
           str+=(char)65+rand()%90;
       }
   vec.push_back(str);
   cout<<vec[j]<<endl;
   str.clear();
   }
   cout<<endl;
   ptr_array=&vec[0][0];
   fn_pointer(ptr_array);
   return 0;
}
P.S. Почему при передаче функции указателя, она выводит совсем не то, что нужно???
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Simpson_
15 / 15 / 3
Регистрация: 06.02.2013
Сообщений: 52
05.10.2013, 22:24     Подскажите почему указатель работает неправильно? #2
del

Добавлено через 6 минут
Функцию fn_pointer замени на
C++
1
2
3
4
5
6
7
8
void fn_pointer(char *ptr_array)
{
       for(int i=0;i<10;++i)
       {
           cout<<*ptr_array++;
     }
       cout<<endl;
}
Добавлено через 3 минуты
или на:

C++
1
2
3
4
void fn_pointer(char *ptr_array)
{
           cout<<ptr_array<<endl;
}
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
05.10.2013, 22:26  [ТС]     Подскажите почему указатель работает неправильно? #3
Simpson_, А почему она не работает в моем варианте, ведь в принципе нечего не меняется, просто убираем один цикл???
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.10.2013, 22:27     Подскажите почему указатель работает неправильно? #4
Без #include <string> у меня не компилируется. А что не то выводит?
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
05.10.2013, 22:31  [ТС]     Подскажите почему указатель работает неправильно? #5
C++
1
2
3
4
5
6
7
8
void fn_pointer(char *ptr_array)
{
 for(int i=0;i<10;++i)
 {
 cout<<*ptr_array++;
 }
 cout<<endl;
}
quote]
P.S. В этом варианте фуекция выведет только первые 10 символов, а мне нужно вывести весь вектор.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.10.2013, 22:32     Подскажите почему указатель работает неправильно? #6
Цитата Сообщение от Nikko12 Посмотреть сообщение
А почему она не работает в моем варианте, ведь в принципе нечего не меняется, просто убираем один цикл???
Потому что в векторе объеты string лежат, а не строки, с которыми эти объекты связаны.
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
05.10.2013, 22:35  [ТС]     Подскажите почему указатель работает неправильно? #7
alsav22, Выводится просто мусор, как будто указатель указывает в неизвестность

Добавлено через 2 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Потому что в векторе объеты string лежат, а не строки, с которыми эти объекты связаны.
Как тогда правильно организовать работу программы??
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.10.2013, 22:43     Подскажите почему указатель работает неправильно? #8
Зачем эти извращения? Есть вектор со строками, вывести строки, в чём проблема?
Если с извращениями, то можно так:
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
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <vector>
#include <string>
using namespace std;
 
void fn_pointer(string *ptr_array)
{
     for(int j = 0; j < 10; ++j)
     {
        cout << *ptr_array++;
        cout << endl;
   }
}
 
int main()
{
   srand(time(NULL));
   vector <string> vec;
   string str;
   int i,j;
   string *ptr_array;
   for(j=0;j<10;++j)
   {
       for(i=0;i<10;++i)
       {
           str+=(char)65+rand()%90;
       }
       vec.push_back(str);
       cout<<vec[j]<<endl;
       str.clear();
   }
   cout<<endl;
   ptr_array = &vec[0];
   fn_pointer(ptr_array);
   
   return 0;
}
Если без извращений:
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
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <vector>
#include <string>
using namespace std;
 
void fn_pointer(const vector <string> &vec)
{
     for(int j = 0; j < vec.size(); ++j)
     {
        cout << vec[j] << endl;
     }
}
 
int main()
{
   srand(time(NULL));
   vector <string> vec;
   string str;
   int i,j;
   
   for(j=0;j<10;++j)
   {
       for(i=0;i<10;++i)
       {
           str+=(char)65+rand()%90;
       }
       vec.push_back(str);
       cout<<vec[j]<<endl;
       str.clear();
   }
   cout<<endl;
  
   fn_pointer(vec);
   
   return 0;
}
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
05.10.2013, 22:59  [ТС]     Подскажите почему указатель работает неправильно? #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Зачем эти извращения?
Что бы лучше разобраться. Можно пойти простым вариантом, но я так не могу. Если смогу реализовать "извращения", то "простой вариант" точно смогу реализовать.
P.S. Но за помощь с кодом с "извращениями" Спасибо.
P.S.S. А подскажите: если функции передать указатель на нулевой элемент вектора, но вывод в функции осуществлять не по строчно, а по символьно?? Буду очень признателен за "отличное извращение".
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.10.2013, 23:19     Подскажите почему указатель работает неправильно? #10
Цитата Сообщение от Nikko12 Посмотреть сообщение
Если смогу реализовать "извращения", то "простой вариант" точно смогу реализовать.
И где вы реализовали извращение?
Цитата Сообщение от Nikko12 Посмотреть сообщение
P.S.S. А подскажите: если функции передать указатель на нулевой элемент вектора, но вывод в функции осуществлять не по строчно, а по символьно?? Буду очень признателен за "отличное извращение".
Вы хотите научиться реализовывать извращения? Вот вам удобный случай, учитесь.
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
05.10.2013, 23:34  [ТС]     Подскажите почему указатель работает неправильно? #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Сообщение от Nikko12
Если смогу реализовать "извращения", то "простой вариант" точно смогу реализовать.
И где вы реализовали извращение?
А я и не говорил, что я "извращаюсь", это Ваши слова.
alsav22
05.10.2013, 23:38
  #12

Не по теме:

Цитата Сообщение от Nikko12 Посмотреть сообщение
А я и не говорил, что я "извращаюсь", это Ваши слова.
А я и не говорил, что ваши. Учиться - это не значит переписыать чужой код. Хотите поупражняться в таких кодах? Флаг в руки и вперёд... Но при чём здесь я?

Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
05.10.2013, 23:58  [ТС]     Подскажите почему указатель работает неправильно? #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Учиться - это не значит переписыать чужой код
Вот этого немного не понял?? О чем речь???
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.10.2013, 00:08     Подскажите почему указатель работает неправильно? #14

Не по теме:

Цитата Сообщение от Nikko12 Посмотреть сообщение
Вот этого немного не понял?? О чем речь???
Вот об этом:
Цитата Сообщение от Nikko12 Посмотреть сообщение
P.S.S. А подскажите: если функции передать указатель на нулевой элемент вектора, но вывод в функции осуществлять не по строчно, а по символьно?? Буду очень признателен за "отличное извращение".



Добавлено через 8 минут

Не по теме:

Польза от упражнений - только для того, кто ими занимается, а не смотрит, как это делают другие.

Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
06.10.2013, 08:54  [ТС]     Подскажите почему указатель работает неправильно? #15
alsav22, Учиться - познавать новое. Если Вы считаете, что после размещения темы на этом сайте с вопрос о помощи, я слепо копирую чужой код, пусть так и будет (не буду Вас переубеждать).
P.S. Думаю наше общение ушло в сторону от намеченной темы.
P.S.S. Скажите alsav22, если после каждой Вашей помощи я не развиваюсь, зачем тогда мне помогать?
alsav22
06.10.2013, 12:22
  #16

Не по теме:

Цитата Сообщение от Nikko12 Посмотреть сообщение
зачем тогда мне помогать?
Смотря в чём помогать.
Вот вы пишите:
Цитата Сообщение от Nikko12 Посмотреть сообщение
Если смогу реализовать "извращения", то "простой вариант" точно смогу реализовать.
Вы же не пишите: "Если увижу, как реализовать "извращения", то "простой вариант" точно смогу реализовать."
Вот и реализовывайте. Ещё раз могу повторить:
Цитата Сообщение от alsav22 Посмотреть сообщение
Польза от упражнений - только для того, кто ими занимается, а не смотрит, как это делают другие.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2013, 18:13     Подскажите почему указатель работает неправильно?
Еще ссылки по теме:

C++ Почему моя программа неправильно работает?
Программа работает неправильно. Цикл не выполняется. Подскажите ошибку C++
C++ Не могу понять, почему программа неправильно работает!

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

Или воспользуйтесь поиском по форуму:
Nikko12
 Аватар для Nikko12
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 162
06.10.2013, 18:13  [ТС]     Подскажите почему указатель работает неправильно? #17
Вопрос по теме теперь, вернее прошу помошь с реализацией посимвольного вывода.Я думаю (может не прав, поправьте), что для этого мне понадобится массив указателей, где каждый элемент массива указывает на нулевой элемент строки, т.е. указывает на vec[0][0], vec[1][0], vec[2][0]. Проблема в том, что указатели неправильно складываются, т.е. если первый указатель указывает на vec[0][0], то второй должен указывать на vec[0][1], а этого не происходит, почему не понимаю . Вот код:
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
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <vector>
using namespace std;
int main()
{
   srand(time(NULL));
   vector <string> vec;
   char str[10];
   int i,j;
   char *ptr_array;
   char array[10];
   for(j=0;j<10;++j)
   {
       for(i=0;i<10;++i)
       {
           str[i]=char(65+rand()%90);
       }
   vec.push_back(str);
   ptr_array=&vec[j][0];
   array[j]=*ptr_array;
   }
   cout<<endl;
   for(i=0;i<vec.size();++i)
   {
       *ptr_array=array[i];
       for(j=0;j<vec[i].length();++j)
       {
           cout<<*ptr_array++;
       }
       cout<<endl;
   }
   return 0;
}
Подскажите??

Добавлено через 1 час 1 минуту
Вроде получилось:
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
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <vector>
using namespace std;
void fn_pointer(char *ptr_array,vector <string> vec)
{
     for(int i=0;i<vec.size();++i)
   {
       ptr_array=&vec[i][0];
       for(int j=0;j<vec[i].length();++j)
       {
           cout<<*ptr_array++;
       }
       cout<<endl;
   }
}
int main()
{
   srand(time(NULL));
   vector <string> vec;
   char str[10];
   int i,j;
   char *ptr_array;
   char array[10];
   for(j=0;j<10;++j)
   {
       for(i=0;i<10;++i)
       {
         str[i]=char(65+rand()%25);
       }
   vec.push_back(str);
   ptr_array=&vec[j][0];
   array[j]=*ptr_array;
   cout<<vec[j]<<endl;
   }
   cout<<endl;
   fn_pointer(ptr_array,vec);
   return 0;
}
Yandex
Объявления
06.10.2013, 18:13     Подскажите почему указатель работает неправильно?
Ответ Создать тему
Опции темы

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