Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Двумерный ДИНАМИЧЕСКИЙ массив в С++
 
 автор: Евгений Петров   (28.04.2006 в 20:19)   письмо автору
 
 

Никогда не думал, что поймаю себя на таком, а только что поймал. Как создать динамически 2-мерный массив на С++. Все мои попытки написать что то вроде:
int * arr = new int[10][10];

успехом не увенчались

   
 
 автор: codexomega   (28.04.2006 в 20:44)   письмо автору
 
   для: Евгений Петров   (28.04.2006 в 20:19)
 

Примеров много и все они разные.
http://www.google.ca/search?q=2+dimensional+dynamic+array+in+c%2B%2B&hl=fr&lr=&start=0&sa=N

   
 
 автор: Евгений Петров   (28.04.2006 в 20:50)   письмо автору
 
   для: codexomega   (28.04.2006 в 20:44)
 

Вообщем я так понял что обявить массив одним оператором не получится? Создавать надо в цикле и удалять тоже?

   
 
 автор: cheops   (28.04.2006 в 22:00)   письмо автору
 
   для: Евгений Петров   (28.04.2006 в 20:50)
 

Замучаетесь так, на С/С++ все давно выделяют память под весь объект, т.е. нужен вам массив 10x10 - объявляйте одномерный массив на 100 элементов и пилите его сами при помощи манипуляции индексами. Тогда у вас будет один оператор new и один оператор delete и соответственно одна проверка, а не десять. Точно также и с структурами - именно за этим в них вводится специальное поле size, определяющее размер структуры.

   
 
 автор: Евгений Петров   (28.04.2006 в 22:26)   письмо автору
 
   для: cheops   (28.04.2006 в 22:00)
 

Ясно, спасибо!

   
 
 автор: Евгений Петров   (29.04.2006 в 23:54)   письмо автору
 
   для: Евгений Петров   (28.04.2006 в 22:26)
 

А как сделать обычный одномерный массив строк? :)

   
 
 автор: cheops   (30.04.2006 в 00:30)   письмо автору
 
   для: Евгений Петров   (29.04.2006 в 23:54)
 

Ну это не совсем уже одномерный массив получается... вообще с С (ну и с С++ тоже) хорошо идут дела, когда понимаешь, что никаких массивов и строк в нём отродясь не бывало, а есть лишь указатели :))) Одномерный массив строк это тоже самое что и двойной указатель
char **str;

Под него выделятся одномерный массив указателей, каждый из которых потом будтет укзывать на строку. Строки, массивы, указатели - это суть одно и тоже, только записывается по разному. Поэтому в C/C++ массивы и строки такие сложные - их просто нет - вместо них указатели на область памяти, причём охрана грац памяти ложиться на плечи программиста. Именно поэтому такая высокая скорость у программ, созданных с использованием C/C++ - не тратятся ресурсы на контроль каждой операции, как в других языках.

PS Если вы задумываетесь над чем-то вроде массива строк с последующей сортировкой - вы созрели для STL - эта библиотека как раз для таких вещей затачивалась.

   
 
 автор: cheops   (30.04.2006 в 00:59)   письмо автору
 
   для: 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 выглядит как
H\0llo\0

А после последнего нулевого символа ещё 14 байт мусора.

   
 
 автор: Евгений Петров   (30.04.2006 в 14:19)   письмо автору
 
   для: cheops   (30.04.2006 в 00:59)
 

В том то и проблема, что инициализироваь их надо динамически...

   
 
 автор: cheops   (30.04.2006 в 15:08)   письмо автору
 
   для: Евгений Петров   (30.04.2006 в 14:19)
 

А это что за строки? Что будет храниться в массиве?

   
 
 автор: Tomcat   (30.04.2006 в 16:16)   письмо автору
 
   для: 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));
}
}

   
 
 автор: Евгений Петров   (30.04.2006 в 17:33)   письмо автору
 
   для: cheops   (30.04.2006 в 15:08)
 

Ну что то вроде такого:
str[0] = "type"
str[1] = "name"
str[2] = "("
str[3] = ")"
str[4] = ","
str[2] = ";"

Вообщем это автомат Мура будет, а в массивах входной и выходной алфавиты и название состояний.

   
 
 автор: Евгений Петров   (02.05.2006 в 15:36)   письмо автору
 
   для: Евгений Петров   (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";

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования