| Другое > 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, а потом давать ей сразу при вызове динамическое число строк. Чтобы не создавать массив, загонять в него строки, а потом кидать его в функцию. Удобно. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |