Другое > Hard'n'Soft
Програмирование на C++
<< < (20/25) > >>
gepar:

--- Цитата: Mr2 ---pArray =new int[val1][val2];
--- Конец цитаты ---
Так кто же так делает. Тоесть по твоему массив массивов напрямую создать нельзя, а вот через new массив массивов сразу вот так можно, интересная у тебя логика  :)
Вот быстро набросанный пример массива массивов

--- Код: ---int main ()
{
    int m,n;
    cin>>m>>n;
    int *a[m];
    for (int i=0;i<m;i++)
    {
        a[i]=new int [n];
        for (int j=0;j<n;j++)
         a[i][j]=i*j;
    }
    cout<<a[3][2];
}

--- Конец кода ---
Заполнение сделал чтобы нагляднее было если же просто сделать динам. двухмерный массив то

--- Код: ---int *a[m];
 for (int i=0;i<m;i++)
  a[i]=new int [n];

--- Конец кода ---
Если не хочется использовать 0-элементы то можно после     cin>>m>>n; добавить m++ и n++  :)

Добавлено позже:

--- Цитата: GManiac ---http://www.emu-land.net/forum/index.php/topic,49888.msg705059.html#msg705059
--- Конец цитаты ---
Ну то что в условии можно делать присваивание это чаще всего (но не всегда) неудобно, некоторые компиляторы правда предупреждают если где то в условии идёт = вместо ==.
Mr2:
GManiac синтаксис я не знаю.

--- Цитата: gepar --- Так кто же так делает. Тоесть по твоему массив массивов напрямую создать нельзя, а вот через new сразу массив массивов сразу вот так можно, интересная у тебя логика 
--- Конец цитаты ---
Логика у меня такая, раз можно одномерный, то почему двумерный нельзя?Ведь статический двумерный  создаётся как и одномерный.

--- Код: --- int array[5][5];
--- Конец кода ---
gepar:
Mr2,а ничего что обычный двумерный массив создаётся при компиляции а когда ты сам вводишь m и n откуда же компилятору знать какой он тогда у тебя там будет? Значит он не может рассчитать выделение памяти посему ты создаёшь массив указателей (это будет динам. выделено место в хипе), а потом заставляешь каждый указатель указывать на другие указатели (тоже место будет динам. выделено в хипе). При этом элементы массива в хипе будут не подряд так что арифметика указателей тут не применима. Ну это я чтобы понятно было, можно проще - запоминаешь эту схему и делаешь свой n-мерный массив.

--- Код: ---int *a[m];
 for (int i=0,j=0...;i<m;i++,j++,...)
 {
    a[i]=new int [n];
    a[i][j]=new int[z]
    ....
  }


--- Конец кода ---
HardWareMan:

--- Цитата: gepar от 25 Май 2011, 12:36:36 ---...
--- Конец цитаты ---
И где же ваш .NET?

--- Цитата: gepar от 25 Май 2011, 13:11:03 ---...Значит он не может рассчитать выделение памяти посему ты создаёшь массив указателей (это будет динам. выделено место в хипе), а потом заставляешь каждый указатель указывать на другие указатели (тоже место будет динам. выделено в хипе). При этом элементы массива в хипе будут не подряд так что арифметика указателей тут не применима. Ну это я чтобы понятно было, можно проще - запоминаешь эту схему и делаешь свой n-мерный массив.
--- Конец цитаты ---
Ну прям по своему комиксу. :3 А что мешает сделать конструкцию из переопределения массивов в куче при смене размера? SetLength так и работает в тобой ненавистных Дельфях: при уменьшении размера он просто триммит в куче массив, а при увеличении - определяет новый, копирует из старого все действительное в новый и освобождает старый. И, кстати, судя по сему, многомерные массивы тоже являются массивом указателей на указатели на массивы... Только вот все это скрыто.
gepar:

--- Цитата: HardWareMan ---И где же ваш .NET?
--- Конец цитаты ---
Это ты к чему?  :?
HardWareMan:

--- Цитата: gepar от 25 Май 2011, 13:16:49 ---Это ты к чему?  :?

--- Конец цитаты ---
Это я к этому:

Типичная ошибка запуска .NET программы на компе с отсутствующим этим самым .NET. У меня их целый букет и программка работает. :3 Наверное Маньякыч ее на шарпе писал. :3
gepar:
HardWareMan,да ну, visual studio когда я её ставил позаботилась чтобы фреймворки у меня были установлены да ещё и своих расширенных версий наставила. Не думаю что дело в этом, может быть проблема в том что у меня 64х битная 7ка.
Mr2:

--- Цитата: gepar ---а когда ты сам вводишь m и n откуда же компилятору знать какой он тогда у тебя там будет?
--- Конец цитаты ---
Компилятор не знает какого размера у меня будет одномерный дин.массив, но всеравно его создаёт.
Тут скорее дело во втором указателе, чем в размере.
pArray =new int[val1][val2];
HardWareMan:

--- Цитата: gepar от 25 Май 2011, 13:23:30 ---HardWareMan,да ну, visual studio когда я её ставил позаботилась чтобы фреймворки у меня были установлены да ещё и своих расширенных версий наставила. Не думаю что дело в этом, может быть проблема в том что у меня 64х битная 7ка.
--- Конец цитаты ---
Возможно. Но у меня вот что (И кто тут говорил, что на Ц самые маленькие программки, а у дельфи все программы весят от 300к? Смотрите скока либов таскать надо за ними, при том, что 300к программа дельфи полностью автономна. Ну можно и меньше, но тогда придется таскать целый 1,2Мбайта рантайм библиотек. :3).

PS Между прочим, сейчас шарп курирует тот чел, который в свое время у борланда курировал дельфю. Заметили сходства, правда? Но он полностью на .NET.
gepar:

--- Цитата: Mr2 ---Компилятор не знает какого размера у меня будет одномерный дин.массив
--- Конец цитаты ---
Там какая-то хитрая сложная реализация специально для одномерного динам. массива сделана чтобы удобно было, по этой же причине ты можешь передавать функциям одномерный массив не указывая его размер, а двумерный - нет. То же самое и в дельфи с паскалем.

Добавлено позже:

--- Цитата: HardWareMan ---Возможно. Но у меня вот что (И кто тут говорил, что на Ц самые маленькие программки, а у дельфи все программы весят от 300к? Смотрите скока либов таскать надо за ними, при том, что 300к программа дельфи полностью автономна. Ну можно и меньше, но тогда придется таскать целый 1,2Мбайта рантайм библиотек. :3).
--- Конец цитаты ---
Нет, я наоборот писал (не в этой теме) что это глупо когда СУПИР_КАЛЬКУЛЯТОР_БАЙ_ВАСЯ написаный на .NET весом 50 кб не запуститься без 50 мб мелкософтовских библиотек, вспоминай  :) Ещё хитрая VS2010 не хочет создавать приложения для старого фреймворка и когда ты хочешь создать новый проект для старого фреймворка она (ВНИМАНИЕ!) хочет VS2008!
Mr2:

--- Цитата: gepar от 25 Май 2011, 13:29:02 ---Там какая-то хитрая сложная реализация специально для одномерного динам. массива сделана чтобы удобно было, по этой же причине ты можешь передавать функциям одномерный массив не указывая его размер, а двумерный нет. То же самое и в дельфи с паскалем.

--- Конец цитаты ---
Вон оно что?!Могли бы реализовать и для двух - трёх мерных. Лентяи. :)
gepar:
GManiac,по поводу объявлений функций с параметрами без имён - забыл добавить что в исключениях это удобно и можно сделать вот так

--- Код: ---   try
   {
      cout << "  Function throwException throws an exception\n";
      throw exception(); //сгенерировать исключение
   }

// поймать наше исключение (имя не надо, но при этом исключение будет поймано и передано по ссылке тоесть ничего копироваться не будет)
// такой вот финт ушами
   catch ( exception & )
   {
      cout << "  Exception handled in function throwException"
         << "\n  Function throwException rethrows exception";
      throw; // выбросить исключение другому обработчику
   }

--- Конец кода ---
Думаю этот пример будет более полезным и понятным чем мой прошлый.

Добавлено позже:
Пи.Си:
На данный момент самый конструктивный срач на эму-ленде - никто никого не называет утятами, дураками и фанбоями. Удивительно :D
DeniSS:
А я в детстве на БАСИКе писал, он круче всех  :lol:
HardWareMan:

--- Цитата: gepar от 25 Май 2011, 13:32:05 ---Там какая-то хитрая сложная реализация специально для одномерного динам. массива сделана чтобы удобно было, по этой же причине ты можешь передавать функциям одномерный массив не указывая его размер, а двумерный - нет. То же самое и в дельфи с паскалем.
--- Конец цитаты ---
Но как?! (с) Мосс.
Код:

--- Код: ---type
  TMyArray = array of array of string;
var
  MyArray:TMyArray;

function Diag(X:TMyArray):TMyArray;
var z:integer;
begin
     Result:=X;
     for z:=0 to 3 do
         Result[z][z]:='Z='+IntToStr(z)+':Z='+IntToStr(z);
end;

procedure TForm1.FormShow(Sender: TObject);
var x,y:integer;
    l:string;
begin
     SetLength(MyArray,4);
     for x:=0 to 3 do SetLength(MyArray[x],4);
     for x:=0 to 3 do
         for y:=0 to 3 do
             MyArray[x][y]:='X='+IntToStr(x)+':Y='+IntToStr(y);
     memo1.Lines.Clear;
     memo1.Lines.Add('Before');
     for y:=0 to 3 do begin
         l:='';
         for x:=0 to 3 do
             l:=l+MyArray[x][y]+'  ';
         Memo1.Lines.Add(l);
         end;
     MyArray:=Diag(MyArray);
     memo1.Lines.Add('After');
     for y:=0 to 3 do begin
         l:='';
         for x:=0 to 3 do
             l:=l+MyArray[x][y]+'  ';
         Memo1.Lines.Add(l);
         end;
end;
--- Конец кода ---
Результат:

--- Код: ---Before
X=0:Y=0  X=1:Y=0  X=2:Y=0  X=3:Y=0  
X=0:Y=1  X=1:Y=1  X=2:Y=1  X=3:Y=1  
X=0:Y=2  X=1:Y=2  X=2:Y=2  X=3:Y=2  
X=0:Y=3  X=1:Y=3  X=2:Y=3  X=3:Y=3  
After
Z=0:Z=0  X=1:Y=0  X=2:Y=0  X=3:Y=0  
X=0:Y=1  Z=1:Z=1  X=2:Y=1  X=3:Y=1  
X=0:Y=2  X=1:Y=2  Z=2:Z=2  X=3:Y=2  
X=0:Y=3  X=1:Y=3  X=2:Y=3  Z=3:Z=3  

--- Конец кода ---
Я по ходу работы такие хитрожопые конструкции в куче передавал в процедуры/функции в дельфе (и извлекал кстати тоже), что у некоторых тут волосы на заднице начнут шевелиться. И ничего, работает. А вот TP7 такого не позволял, да.
gepar:
HardWareMan,ты щедрый на комментарии  :)  Но если я правильно понял то ты передаёшь не двумерный массив, ты передаёшь что-то вроде указателя. Спецификация же не позволяет создать функцию

--- Код: ---void print(int a[][], int z)
--- Конец кода ---
что в с++ что в делфи. Но логично что это можно обойти и сделать что-то вроде этого

--- Код: ---void print(int *a[], int m,int n)
{
    for (int i=0;i<m;i++)
     for (int j=0;j<n;j++)
      cout<<a[i][j]<<'\t';
}
int main ()
{
    int m,n;
    cin>>m>>n;
    int *a[m];
    for (int i=0;i<m;i++)
    {
        a[i]=new int [n];
        for (int j=0;j<n;j++)
         a[i][j]=i*j;
    }
    print (a,m,n);
}

--- Конец кода ---
Волосы на жопе шевелиться от реализации на с++ не должны, как на дельфи не знаю  :)
GManiac:
gepar, не знаю, почему мой дизасм у тебя не запускается, у меня на всех компах работает. Правда, я его компилил с минимальной либой (msvcrt7 что ли), поэтому он такой маленький, и возможно, требует редистрибутейблы. Но у тебя ведь стоит VS!
Написан он на VC++ 2003, никаких дотнетов.

Mr2, то ты говоришь, что C++ знаешь, потом говоришь, что синтаксис не знаешь. Понятней уж скажи. Просто напиши пример, подобный моему, с массивами.
Mr2:

--- Цитата: GManiac от 25 Май 2011, 14:50:17 ---Mr2, то ты говоришь, что C++ знаешь, потом говоришь, что синтаксис не знаешь. Понятней уж скажи. Просто напиши пример, подобный моему, с массивами.

--- Конец цитаты ---
sum( [ 2, 3, 4, 5 ] ) такой херни в C++ не видел. >:(
Опиши задачу, может чего и сделаю. Твои примеры мне не о чём не говорят.


Добавлено позже:
суммирование всех элементов динамического массива, с индекса 0 до его конца


--- Код: ---for (int i=0; i<5 ;++i;){
 array[i]+=array[i];
}
--- Конец кода ---

суммирование всех элементов статического массива, например, с 1-го по 5-й, если он был объявлен как array[1..5]


--- Код: ---int sum =0;
for (int i=0; i<5 ;++i;){
 sum+=array[i];
}
--- Конец кода ---

суммирование фактически переданных в вызов чисел: 2 + 3 + 4 + 5.
 Как я понял то же что и предыдущие задание.
GManiac:
Я же выше описывал. Ладно, заново. Готовый проект для дельфи, засовываешь и компилишь. Комментарии там же.
writeln я специально засунул внутрь функции, чтобы не менять вызовы.

Добавлено позже:
Ты это как функции оформи.

Добавлено позже:
Как функции, которые можно использовать по-нормальному, а не от 1 до 5 для одного случая, так для одного массива, сяк для другого.
Mr2:

--- Цитата: GManiac от 25 Май 2011, 15:44:09 ---Я же выше описывал. Ладно, заново. Готовый проект для дельфи, засовываешь и компилишь. Комментарии там же.
writeln я специально засунул внутрь функции, чтобы не менять вызовы.
--- Конец цитаты ---
Не говори больше этого слова! :D Я не знаю синтаксис Delphi.  <_<


--- Цитата: GManiac от 25 Май 2011, 15:44:09 ---Добавлено позже:
Ты это как функции оформи.
--- Конец цитаты ---
А в чём подвох? :?

--- Цитата: GManiac от 25 Май 2011, 15:44:09 ---Добавлено позже:
Как функции, которые можно использовать по-нормальному, а не от 1 до 5 для одного случая, так для одного массива, сяк для другого.

--- Конец цитаты ---

--- Код: ---//25.05.2011 Операции с массивом 01.
// Author by Mr2


#include<iostream>
using namespace std;

void arrayFn(int array[],int size);

int main(){
 int sizeA =5;
 int array[]={1,2,3,4,5};
 arrayFn(array, sizeA);
 system("pause");

}
void arrayFn(int array[],int size){  
     int sum =0;
     for (int i=0; i<size ;++i)
      sum+=array[i];
     cout << "Summ all numbers is: "<<sum <<endl;  
     for (int i=0; i<size ;++i){
      array[i]+=array[i];    
      cout << "Summ array is: "<<array[i] <<endl;
 }
}

--- Конец кода ---



Добавлено позже:
Кажется я понял в чём подвох.Сейчас GManiac напишит спасибо за функцию, а то самому в лом было писать. :lol:

--- Код: ---//25.05.2011 Операции с массивом 02.
// Author by Mr2


#include<iostream>
using namespace std;

void arrayFn(int array[],int size);

int main(){
 int sizeA =5;
 int array[sizeA];
 for(int i=0,v=1; i<sizeA ;++i,++v)
  array[i]=v;
 arrayFn(array, sizeA);
 system("pause");

}
void arrayFn(int array[],int size){  
 int sum =0;
 for (int i=0; i<size ;++i)
  sum+=array[i];
 cout << "Summ all numbers is: "<<sum <<endl;  
 for (int i=0; i<size ;++i){
  array[i]+=array[i];    
  cout << "Summ array is: "<<array[i] <<endl;
 }
}

--- Конец кода ---
GManiac:

--- Цитата ---Сейчас GManiac напишит спасибо за функцию, а то самому в лом было писать.
--- Конец цитаты ---
Как ты угадал?  :lol: Цель примера была показать, что и там, и там есть гибкость. А в дельфях даже размер не надо указывать, и индекс передаётся индексом, а не указателем (например, начать вычисления с 3-го элемента).
Мне, например, бывает удобно написать функцию, берущую array of string, а потом давать ей сразу при вызове динамическое число строк. Чтобы не создавать массив, загонять в него строки, а потом кидать его в функцию. Удобно.
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии