LINUX.ORG.RU
Ответ на: комментарий от beastie

Да, но у меня не char

    string s[3][100]; // dont work

    /*string **s; // work
    s = new string*[3];
    s[0] = new string[100];
    s[1] = new string[100];
    s[2] = new string[100];*/
cannot convert 'std::string (*)[100] {aka std::basic_string<char> (*)[100]}' to 'std::string** {aka std::basic_string<char>**}' for argument '1' to 'void bubbleSort(std::string**, int)'
     bubbleSort(s , count);
                         ^
abs ★★★
() автор топика
Ответ на: комментарий от abs

Ты спрашивал, как спрашивать. ;)

В C++ не силён и не знаю его, но что-то мне подсказывает, что указание длины string'у не имеет смысла.

Т.е. тебе нужно что-то вроде:

string s[3];

s[0] = "whatever";
s[1] = "it";
s[2] = "should be";

cast const86

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)

Плюсы дали им универсальный интерфейс работы с контейнерами, дали хорошие строки. Но ведь им лень читать книги, они хотят отстреливать себе ноги...

Solace ★★
()
Ответ на: комментарий от x0r

он же потом делает s[0] = new string[100];

Это я и имею в виду под лишними телодвижениями

yoghurt ★★★★★
()
Ответ на: комментарий от Solace

Прежде чем говорить лучше бы код посмотрел. Мне нужно 300 строк, а не 3 строки длинной в 100 символов. Более того, код не работает и я привел ошибку компилятора которая об этом говорит.

abs ★★★
() автор топика
Ответ на: комментарий от x0r

он же потом делает s[0] = new string[100]; такое точно не work.

Ты звездочку пропустил. в s[0] должен быть массив из 100 строк.

UPD. Туплю, ненужна там звездочка.

abs ★★★
() автор топика
Последнее исправление: abs (всего исправлений: 1)

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

Harald ★★★★★
()
Ответ на: комментарий от Solace

потому что он говно

Естественно потому что мне просто нужно было сдать лабу в универе. Но все же почему не работает код?

abs ★★★
() автор топика
Ответ на: комментарий от Harald

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

Разумеется надо. Где бы время найти? Мне нужно готовится к экзамену по украинскому...

abs ★★★
() автор топика
Ответ на: комментарий от abs

Разумеется надо. Где бы время найти? Мне нужно готовится к экзамену по украинскому...

Времени у тебя был целый семестр :P

Harald ★★★★★
()
Ответ на: комментарий от Harald

Времени у тебя был целый семестр :P

Как выучить С++ за 21 день ^W^W один семестр в КПИ с блекджеком и шлюхами ^W^W украинским и физрой.

abs ★★★
() автор топика
Ответ на: комментарий от abs

Ну да, украинский виноват и физра, конечно же.

Создай тред в Development, выложи код целиком, может среди закидавших тебя какашками анонимусов найдётся один с правильным советом по теме

Harald ★★★★★
()
Ответ на: комментарий от abs

Но все же почему не работает код?

Потому что ты не знаешь указатели. Потому что ты ленивая жопа и не стал гуглить, что такое stl и как его готовить. Потому что ты пишешь C-style в C++. Причин много, в общем.
И да, на лабы дается семестр. За семестр понять базовые принципы работы stl - это 30 минут в день максимум.

Solace ★★
()
Ответ на: комментарий от Solace

Потому что ты не знаешь указатели.

Почему это я не знаю указателей? По поводу Си-стайла так и было задумано. Я просто экономил время на чтение файла,и возможность писать «for(int i =»

abs ★★★
() автор топика
Ответ на: комментарий от Harald

Ну да, украинский виноват и физра, конечно же.

А ещё труд и пение.

aidan ★★★★
()
Ответ на: комментарий от qulinxao

тут можно plainC

Разумеется можно, я и не спорю. Но вопрос открытый. Что гораздо интереснее *string = string[]; Но уже с двойным указателем такой фокус не пройдет

abs ★★★
() автор топика

Как назвать вот это — **string != string[][] — я даже не берусь понять.

Двойное разыменование сравнивается с объявлением переменной? И обе переменные названы по имени типа?

И правильно Solace говорит  — надо учиться использовать контейнеры stl.

jeuta ★★★★
()
Ответ на: комментарий от jeuta

**string != string[][]

Я имел в виду почему это разные типы данных

cannot convert 'std::string (*)[100] {aka std::basic_string<char> (*)[100]}' to 'std::string** {aka std::basic_string<char>**}' for argument '1' to 'void bubbleSort(std::string**, int)'
     bubbleSort(s , count);
abs ★★★
() автор топика
Ответ на: комментарий от abs

ты ещё и в чтение не можешь

твой код есть смесь.

а так как и с и с++ ны зна на уровне почти не достаточном даже для лаб_твоих, то и ошибки.

если ты сможешь в указатели, сможешь и в plainC

но как тебе уже выше указали проще в stl vector,

при том что указатели это не сложно vector позволяет меньше об этом.

qulinxao ★★☆
()
Ответ на: комментарий от abs

Мне нужно 300 строк

так 300 строк, которые вы сделали в первой строчке, или 3 переменной длины массива строк, которые вы делали далее по коду?

конечно, компилер не понял ваших пожеланий

next_time ★★★★★
()
Ответ на: комментарий от abs

и возможность писать «for(int i =»

для этого как раз проще использовать вектора. в общем, когда производительность абсолютно не критична, лучше делать так:

vector<vector<string>> s;

next_time ★★★★★
()
Ответ на: комментарий от next_time

так 300 строк
или 3 переменной длины массива строк

Это разве не одно и тоже? В любом случае мне было нужно string s[3][100]

abs ★★★
() автор топика
Ответ на: комментарий от abs

нет, далеко не одно и тоже. в первом случае у вас на стеке строго 300 указателей, т.к. это стек, то именно строго.

а во втором, у вас на стеке 3 указателя на массивы переменной длины.

В любом случае мне было нужно string s[3][100]

а это уже массив из строго 3-х указателей на массивы из строго 100 строк. вам точно именно это нужно?

next_time ★★★★★
()
Ответ на: комментарий от next_time

а во втором, у вас на стеке 3 указателя на массивы переменной длины.
а это уже массив из строго 3-х указателей на массивы из строго 100 строк.

Почему у нас три указателя? У нас один указатель, а вот уже s[0],s[1],s[2] эти конкретные указатели. Я все ещё не вижу разницы. Во втором случае массив переменной длины это разве не указатель? Ведь когда мы пишем A[100]; Никакой известности об этом 100 нет, и A из себя представляет просто указатель на нулевой элемент.

abs ★★★
() автор топика
Ответ на: комментарий от Gvidon

Потому что и в С, и в С++ массивы и указатели — это разные вещи.

Да, но int * a; int a[n]; В этих случаях a ведет себя одинаково.

abs ★★★
() автор топика
Ответ на: комментарий от abs

Нет. В этих случах a — это совершенно разные сущности с точки зрения языка.

Gvidon ★★★★
()

Я даже открыл из интереса стандарт C++11 и нашёл там ответ на твой вопрос, параграф «8.3.4 Arrays»

Harald ★★★★★
()
Ответ на: комментарий от abs

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

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

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

а отличие между указателем и константой(не const языка а именем которое в данном скопе всегда imutable_значение местоположения) исчезает при передачи в функцию по значению.

qulinxao ★★☆
()
Ответ на: комментарий от abs

у С ( да и С++) «естественный» синтаксис - т.е они не через много-много времени великий_законодатель дал на века ортогональный и самосогласованный синтаксис ,

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

поэтому куча «неправильностей» и умолчаний простого случае не действующие в общем.

язык фигли.

qulinxao ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.