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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> масив указателей, ошибка при инициализации масив указателе 
:(
    Опции темы
grisWall
Дата 29.4.2013, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем доброго времени суток у меня проблема не могу в С++ инициализировать массив указателей т.е. могу, но вот именно этим способом не получается, кто подскажет что я делаю не так и вообще возможно ли такое:

Код

// test.cpp
#include <iostream>

using namespace std;

int main(void){
char *str[] = "Hello world!";

cout << *str << endl;

return 0;



в консоли ввожу:
$ g++ test.cpp -o test

на выводе ошибка
test.cpp: В функции «int main()»:
test.cpp:7:16: ошибка: array must be initialized with a brace-enclosed initializer
  char *str[] = "Hello world!";
                ^


Код

// test.cpp
#include <iosteam>

using namespace std;

char *str [] = {"Hello world!"};

int main(void){
cout << *str << endl;
return 0;
}


ввожу:

$ g++ test.cpp -o test

выдает:

test.cpp:6:30: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
 char *str[] = {"Hello world!"};
                              ^

Код

// test.cpp
#include <iosteam>

using namespace std;

int main(void){
static char *str [] = {"Hello world!"};
cout << *str << endl;
return 0;
}



ввожу: 

$ g++ test.cpp -o test

выдает:

test.cpp: В функции «int main()»:
test.cpp:7:38: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
  static char *str[] = {"Hello world!"};
                                      ^


везде в примерах видел и в книгах и на форуме что такое возможно, а у меня не получается 


может кто сталкивался с таким или знает как это решается у меня система Archlinux недавно делал update совсем на днях почти


у меня еще много чего не понятного в С++ встречается что например в Си работает и связанно это с указателями и переменными а так же массивами, просто дальше я еще не продвинулся так сказать изучаю поступательно по мере понимания, владения; то чего не знаю пытаюсь изучить, но если даже это не работает, что уж говорить о перегрузке и классах там я вообще захлебнусь мне кажется...или потеряюсь где нибудь так что вообще не выберусь.... страшновато становится..

Код

//test.c
#include <stdio.h>

int main(void){
static char *str[] = {"Hello world!"};
printf("%s\n",*str);
return 0;
}


$ gcc test.c -o test
$ ./test 
Hello world!
-----------------------------------
Нормально работает


Код

// test.cpp
#include <stdio.h>

int main(void){
static char *str[] = {"Hello world!"};
printf("%s\n",*str);
return 0;
}


Ввожу:

$ gcc test.cpp -o test

на выходе:

test.cpp: В функции «int main()»:
test.cpp:5:38: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
  static char *str[] = {"Hello world!"};
                                      ^
///// И снова предупреждение....

Если кто ответит заранее благодарю за помощь...
PM MAIL   Вверх
math64
Дата 29.4.2013, 07:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



строка в кавычках - это const char*. Следовательно,
Код

static const char* str[] = { "Hello World!"};

или, если нужно без const:
Код

static char[] helloWorld = "Hello World!";
static char* str[] = { helloWorld };

static в зависимости от использования можно не писать.
PM   Вверх
NoviceF
Дата 29.4.2013, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(grisWall @  29.4.2013,  04:00 Найти цитируемый пост)
инициализировать массив указателей


ну и так, на всякий случай, ты же видишь, что у данного массива получает только 1 элемент, то есть, если нужно сделать массив из нескольких указателей указывающих на строки, должно быть что-то типа

Код

static const char* str[] = { "Hello World!", "qwert", "asdf" };

PM MAIL   Вверх
grisWall
Дата 29.4.2013, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а еще смежный вопрос такой

Код

char ** month(const char * mas[]){
*mas = 
"Hello", "world", "!", "my darling", 
"Привет мир!", "мой дорогой"
;
return (char**) mas;
}
char ** month(const char **);
int main(void){
char ** m;
const char* value[] = {"Hello my darling"};
m = month(value); int i=1;
//for( ; *m; i++)
std :: cout << *(m+i) << std :: endl; 
return 0;
}


все компилирует вроде бы но при вызове
Код

int i=1;
std :: cout << *(m+i) << std :: endl;
 

выдает ошибку сегментирования


PM MAIL   Вверх
volatile
Дата 29.4.2013, 23:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(grisWall @  29.4.2013,  23:13 Найти цитируемый пост)
все компилирует вроде бы 


grisWall, вы меня извините конечно, но вам нужно читать учебник для самых начинающих.
ваш код это - бред.
ошибок и бессмыслиц больше чем операторов.

PM MAIL   Вверх
grisWall
Дата 29.4.2013, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



пусть плохой пример никчемный, но мне понять саму семантику указателей, как они работают через такие вот ошибки а вообще в Си / С++ можно ли передавать массив из функции 
Код

int ** f(){
int * mas[] = {1,2,40,21}; 
return mas;
}


а потом в main обращаться к нему
Код

int main(){
int **n = f();
std :: cout << n[0] << n[1] << n[2] << std :: endl;
}

или такое возбраняется 

может из-за этого у меня ошибка сегментации?

Добавлено @ 23:44
Цитата(volatile @  29.4.2013,  23:30 Найти цитируемый пост)
grisWall, вы меня извините конечно, но вам нужно читать учебник для самых начинающих.
ваш код это - бред.
ошибок и бессмыслиц больше чем операторов.


а какой учебник вы посоветуете? 

я читал у меня два один для чайников С++ за 21 день, а другой С/С++ программироние на языке высокого уровня Т.А.Павловской

там таких подробностей не описано про указатели там написано как они работают в общих чертах а я пишу не в общих чертах а так как мне нужно чтоб это работало или конечно я смотрю и пограничные случаи что бы знать куда можно идти а куда нельзя....если можете что посоветовать с удовольствием выслушаю ( т.е. сочту)...

Это сообщение отредактировал(а) grisWall - 29.4.2013, 23:51
PM MAIL   Вверх
volatile
Дата 29.4.2013, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(grisWall @  29.4.2013,  23:35 Найти цитируемый пост)
можно ли передавать массив из функции 

сам массив вообще нельзя ни передать, ни вернуть.
можно вернуть указатель, но только если это не стековый объект.

Цитата(grisWall @  29.4.2013,  23:35 Найти цитируемый пост)
int ** f(){
int * mas[] = {1,2,40,21}; 
return mas;
}

так делать нельзя.
У вас массив создаецца в стеке.
После возврата из функции, стек будет уничтожен (заполнен чем-то другим и т.д.)
И указатель будет указывать на неизвестно что.

int * mas[] = {1,2,40,21};  // а это, кстати, вообще не имеет смысла. массив указателей на инт, вы заполняете не указателями на инт, а неизвестно чем.

grisWall, вам нужно для начала понять что такое массив, что такое указатель, и что такое инт.
учебник - да в любом пожалуй это есть. (здесь есть прикрепленная тема по этому поводу).
просто нужно понять сначала элементарные вещи.



PM MAIL   Вверх
grisWall
Дата 30.4.2013, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(volatile @  29.4.2013,  23:54 Найти цитируемый пост)
int * mas[] = {1,2,40,21};  // а это, кстати, вообще не имеет смысла. массив указателей на инт, вы заполняете не указателями на инт, а неизвестно чем.


да спасибо за совет я откомпилировал и увидел что вместо int* я занес int в int *mas[] теперь я понял и так делать не буду в учебниках этого не пишут там не пишут чего нельзя делать там лишь только то что можно а чего нельзя понимаешь из примеров но порой не достаточно откомпилировать нужно чтоб еще кто-то тебе сказал что это не получается поэтому а это потому что так-то так-то и так-то  и тогда появляется знание, когда наделаешь кучу ошибок, 
извините что я так многословен просто это выражение моей точки зрения по поводу того что  мне надо почитать учебники я читал но там не сказано того что мне сказали здесь то что

 строка в кавычках это const char* например

я этого не знал теперь буду знать,
а в Си например

Код

char * str[] = {"Hello", "How are you", "Привет мир!"}


работает, а в С++ нет! надо выражение в скобках обязательно в const char* заносить

volatile, а как же мне в int * mas[] занести данные не подскажите?



Это сообщение отредактировал(а) grisWall - 30.4.2013, 02:07
PM MAIL   Вверх
math64
Дата 30.4.2013, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Аналогично, как я вам показывал для строк:
Код

static int i123[] = {1,2,3}, i456[] = {4,5,6}, i789[]={7,8,9};
static int* mas[] = {i123, i456, i789};

static чтобы переменные создавались не на стеке.

Если нужно запонять не фиксированными значениями, нужно выделять память по new:
Код

int* mas[] = { new int[3], new int[3], new int[3]};
mas[0][0] = 1;
...
mas[2][2] = 9;
...
for (int i=0; i < 3; i++)
  delete[] mas[i];


Это сообщение отредактировал(а) math64 - 30.4.2013, 07:15
PM   Вверх
grisWall
Дата 30.4.2013, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



math64, спасибо теперь я понял
 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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