|
|
|
| Никогда не думал, что поймаю себя на таком, а только что поймал. Как создать динамически 2-мерный массив на С++. Все мои попытки написать что то вроде:
int * arr = new int[10][10];
|
успехом не увенчались | |
|
|
|
|
|
|
|
|
для: codexomega
(28.04.2006 в 20:44)
| | Вообщем я так понял что обявить массив одним оператором не получится? Создавать надо в цикле и удалять тоже? | |
|
|
|
|
|
|
|
для: Евгений Петров
(28.04.2006 в 20:50)
| | Замучаетесь так, на С/С++ все давно выделяют память под весь объект, т.е. нужен вам массив 10x10 - объявляйте одномерный массив на 100 элементов и пилите его сами при помощи манипуляции индексами. Тогда у вас будет один оператор new и один оператор delete и соответственно одна проверка, а не десять. Точно также и с структурами - именно за этим в них вводится специальное поле size, определяющее размер структуры. | |
|
|
|
|
|
|
|
для: cheops
(28.04.2006 в 22:00)
| | Ясно, спасибо! | |
|
|
|
|
|
|
|
для: Евгений Петров
(28.04.2006 в 22:26)
| | А как сделать обычный одномерный массив строк? :) | |
|
|
|
|
|
|
|
для: Евгений Петров
(29.04.2006 в 23:54)
| | Ну это не совсем уже одномерный массив получается... вообще с С (ну и с С++ тоже) хорошо идут дела, когда понимаешь, что никаких массивов и строк в нём отродясь не бывало, а есть лишь указатели :))) Одномерный массив строк это тоже самое что и двойной указатель
Под него выделятся одномерный массив указателей, каждый из которых потом будтет укзывать на строку. Строки, массивы, указатели - это суть одно и тоже, только записывается по разному. Поэтому в C/C++ массивы и строки такие сложные - их просто нет - вместо них указатели на область памяти, причём охрана грац памяти ложиться на плечи программиста. Именно поэтому такая высокая скорость у программ, созданных с использованием C/C++ - не тратятся ресурсы на контроль каждой операции, как в других языках.
PS Если вы задумываетесь над чем-то вроде массива строк с последующей сортировкой - вы созрели для STL - эта библиотека как раз для таких вещей затачивалась. | |
|
|
|
|
|
|
|
для: cheops
(30.04.2006 в 00:30)
| | Если инициализация массива производится сразу, то можно записать
int main(int argc, char *argv[])
{
char *str[] = {"Hello","world","!"};
char str1[][20] = {"Hello","world","!"};
}
|
str - будет занимать столько памяти, сколько занимают его элементы, а вот str1, будет занимать 60 байт - по 20 на каждое слов, т.е. не важно, что "Hello" состоит из 6 символов - после него следует ещё 14 байт не занятой памяти, а функции ориентируются лишь на нулевой байт. Так в следующем коде, мы записываем нулевой байт во вторую позицию от Hello остаётся только H
#include <stdio.h>
int main(int argc, char *argv[])
{
char str[20] = "Hello";
printf("%s\n",str); // Hello
// Записываем нулевой байт во вторую позицию
str[1] = '\0';
printf("%s\n",str); // H
exit(0);
}
|
Хотя реально строка str выглядит как
А после последнего нулевого символа ещё 14 байт мусора. | |
|
|
|
|
|
|
|
для: cheops
(30.04.2006 в 00:59)
| | В том то и проблема, что инициализироваь их надо динамически... | |
|
|
|
|
|
|
|
для: Евгений Петров
(30.04.2006 в 14:19)
| | А это что за строки? Что будет храниться в массиве? | |
|
|
|
|
|
|
|
для: cheops
(30.04.2006 в 15:08)
| | Ну, например так :
int *A,;
A=(int *)malloc(n*m*sizeof(int));
for(int i=0;i<n;i++) {
printf("\n");
for(int j=0;j<m;j++){
fscanf(f,"%1d",&(*(A+i*n+j)));
printf("%-3d",*(A+i*n+j));
}
} | |
|
|
|
|
|
|
|
для: cheops
(30.04.2006 в 15:08)
| | Ну что то вроде такого:
str[0] = "type"
str[1] = "name"
str[2] = "("
str[3] = ")"
str[4] = ","
str[2] = ";"
|
Вообщем это автомат Мура будет, а в массивах входной и выходной алфавиты и название состояний. | |
|
|
|
|
|
|
|
для: Евгений Петров
(30.04.2006 в 17:33)
| | Все оказалось гениально просто:
char ** str;
str = new char*[6];
str[0] = "type\0";
str[1] = "name\0";
str[2] = "(\0";
str[3] = ")\0";
str[4] = ",\0";
str[5] = ";\0";
|
| |
|
|
|