23.01.2012, 12:30
23.01.2012, 13:51
Quote:Пакка, ты внимательно читаешь мои сообщения? Rolleyes Я же прямо указал тебе в сообщении 55, что ошибка связана со строкой Img[i]=new TImage(this) - она слишком низко стоит, ты создаёшь объект после обращения к нему. Даже пурпурным цветом её тогда выделил AbГм, не знаю по какой причине, но я прочитал только это))) :
Quote:Частично я уже указал тебе на твою ошибку, смотри пункт 3 моих рекомендаций. Ты не заполняешь в массиве bh элементы вида bh[i][0] числами, и поэтому они принимают значение по умолчанию - то бишь 0. Поэтому, строчка с case 0 всегда срабатывает уже для самого первого элемента массива bh (то бишь, для bh[0][0]). А что в ней происходит? Ты пытаешься (через указатель) обратиться к элементу, который ещё не создан!Вследствие чего не совсем допонял, и сделал неправильный вывод.
Quote:Кстати, а ты вообще понимаешь, что именно делает эта строка?
Теперь да, тогда нет

Точнее догадаться мог, это довольно просто, но я просто не обращал на нее внимания. Да, мне стыдно...
23.01.2012, 14:20
(23.01.2012 12:30)Efrit Wrote: [ -> ]etoprostoya, ну и где здесь функция?
А по существу? Добавь оболочку для функции, которая не влияет на саму возможность обращаться к элементам массивов без использования адресной арифметики.
Code:
void function(void)
{
for(int i = 0; i < 32; i++)
for(int k = 0; k < 32; k++)
{
int tmp = arr[i][k];
arr[i][k] = arr[k][i];
arr[k][i] = tmp;
}
}
23.01.2012, 14:37
packa, теперь всё понятно 
И всё-таки, ради интереса ответь - что же именно, на твой взгляд, делается в той строке
etoprostoya, а где в твоей функции массив-то? arr - это какой-то конкретный глобальный массив, он не в счёт. А я, разумеется, имел в виду реализацию функции, которая транспонирует любой входной двумерный массив (любого размера)...

И всё-таки, ради интереса ответь - что же именно, на твой взгляд, делается в той строке

etoprostoya, а где в твоей функции массив-то? arr - это какой-то конкретный глобальный массив, он не в счёт. А я, разумеется, имел в виду реализацию функции, которая транспонирует любой входной двумерный массив (любого размера)...
23.01.2012, 15:58
Quote:NumImg=8;Резервируем место под 8 элементов
Img=new TImage*[NumImg];
Quote:Img[i]=new TImage(this);Создаем картинку (пустую), на данном элементе (на форме)
Quote:case 4 : Img[i]->Picture->LoadFromFile("14.bmp"); break;Заполняем картинку картинкой)
Вот так я понял
23.01.2012, 16:08
Про любой размер массива речи не было:
Опять придерёшься к чему-то, что не было оговорено? 
Quote:Ну-ка напиши мне функцию транспонирования квадратной матрицы без использования адресной арифметики.Вот тебе код для двумерного массива любого размера:
Code:
int **arr;
void function(int H, int W)
{
for(int i = 0; i < H; i++)
for(int k = 0; k < W; k++)
{
int tmp = arr[i][k];
arr[i][k] = arr[k][i];
arr[k][i] = tmp;
}
}

23.01.2012, 17:23
(23.01.2012 07:47)Efrit Wrote: [ -> ]Ну-ка напиши мне функцию транспонирования квадратной матрицы без использования адресной арифметики.
Code:
void foo(int **arr, int n)
{
int tmp;
for(int i = 0; i < n; i++)
for(int k = i + 1; k < n; k++)
{
tmp = arr[i][k];
arr[i][k] = arr[k][i];
arr[k][i] = tmp;
}
}
(23.01.2012 07:47)Efrit Wrote: [ -> ]Или же, ещё лучше - какую-нибудь функцию с неизвестным числом переменныха это тут причем? у Пакки в программе ими и не пахнет.
(23.01.2012 07:47)Efrit Wrote: [ -> ]желательно строковыхтак это только упрощает задачу
(23.01.2012 07:47)Efrit Wrote: [ -> ]Неужели, по-твоему, C++-программист не должен знать про адресную арифметику?почему в начальных классах не рассказывают матан?
(23.01.2012 07:47)Efrit Wrote: [ -> ]Откуда такая категоричность?плохое впечатление
(23.01.2012 11:35)Solmyr2000 Wrote: [ -> ]я погуглил и нашёл, что ВСЁ во ВСЕХ языках программирования - зло. Деньги, кстати, тоже зло.но в яп нет денег

23.01.2012, 18:23
packa, ты понял не совсем правильно. Команда new не просто "создала картинку" - она вызвала конструктор класса TImage, который как раз и создал объект "картинка", и затем вернула указатель на этот объект. Пойми, что Img - это массив указателей (причём ты его весьма коряво создаёшь, ну да ладно), а не массив объектов. А дальше ты просто обращаешься к объекту "картинка" (созданному конструктором) через указатель на него.
etoprostoya, опять придерусь. Ну неужели ты так и не понял, что что функция должна транспонировать входной массив - то есть он должен как-то описываться среди входных параметров функции? Я же недаром даже выделил слово "входной" жирным (в своём предыдущем сообщении)... Ты же всё упорно пытаешься транспонировать какой-то левый глобальный массив arr - а нужно, чтобы функция транспонировала любой массив, а не только его (о чём я также писал выше).
gamecreator, ты пробовал запускать свою функцию? Напиши-ка ещё инициализацию входного массива и строчку вызова самой функции, ну чисто ради интереса


надеюсь, ты вообще знаешь, что такое "указатель"? 

etoprostoya, опять придерусь. Ну неужели ты так и не понял, что что функция должна транспонировать входной массив - то есть он должен как-то описываться среди входных параметров функции? Я же недаром даже выделил слово "входной" жирным (в своём предыдущем сообщении)... Ты же всё упорно пытаешься транспонировать какой-то левый глобальный массив arr - а нужно, чтобы функция транспонировала любой массив, а не только его (о чём я также писал выше).
gamecreator, ты пробовал запускать свою функцию? Напиши-ка ещё инициализацию входного массива и строчку вызова самой функции, ну чисто ради интереса

gamecreator Wrote:а это тут причем? у Пакки в программе ими и не пахнет.Это я привёл пример, в реализации которого без указателей и адресной арифметики ну никак не обойтись. Или оспоришь?

Quote:так это только упрощает задачуДа ну! Ну давай, реализуй

Quote:почему в начальных классах не рассказывают матан?Если человек хочет хорошо знать математику, то матан ему учить придётся. То же самое и здесь. Тем более, что работа с указателями - это не такая уж и сложная штука. То же истанцирование шаблонов - куда сложнее.
Quote:плохое впечатлениеИ что же там такого плохого? Неужели ты смотрел весь Буст целиком?
23.01.2012, 18:24
Quote:Пакки
Респект дружище!)))
Quote:надеюсь, ты вообще знаешь, что такое "указатель"?Слышал где то

23.01.2012, 18:50
(23.01.2012 18:23)Efrit Wrote: [ -> ]ты пробовал запускать свою функцию?честно - не пробовал. но не сомневаюсь в отсутствии семантических ошибок.
(23.01.2012 18:23)Efrit Wrote: [ -> ]Напиши-ка ещё инициализацию входного массива и строчку вызова самой функции, ну чисто ради интересаинициализация была в предыдущем куске кода. а foo(a,8); и писать нечего.
(23.01.2012 18:23)Efrit Wrote: [ -> ]Это я привёл пример, в реализации которого без указателей и адресной арифметики ну никак не обойтись.пример должен быть уместен. напомню, ты начал доказывать, что без вектора Пакке понадобится знать операции с указателями и адресную арифметику. доводов в подтверждение этого я еще не услышал.
(23.01.2012 18:23)Efrit Wrote: [ -> ]Да ну!ну да. указатель-то всегда 4 байта.
(23.01.2012 18:23)Efrit Wrote: [ -> ]Ну давай, реализуйок, будет.
(23.01.2012 18:23)Efrit Wrote: [ -> ]Если человек хочет хорошо знать математику, то матан ему учить придётся.но перед тем, как учить матан, необходимо еще много узнать. дай Пакке сначала научиться программировать, а потом уже учи его особенностям языка.
(23.01.2012 18:23)Efrit Wrote: [ -> ]И что же там такого плохого? Неужели ты смотрел весь Буст целиком?мне хватило попытки знакомства.
23.01.2012, 19:00
(23.01.2012 17:23)gamecreator Wrote: [ -> ]но в яп нет денег:D Ну я имел в виду, что деньги-то зло, а всё равно нужны

23.01.2012, 19:09
(23.01.2012 18:23)Efrit Wrote: [ -> ]Ну давай, реализуй
Code:
#include <stdio.h>
#include <string.h>
void multicat(char *dest, int n, ...)
{
char **next = (char**) (&n + 1);
dest[0] = 0;
for(int i=0; i<n; i++, next++)
{
strcat(dest,*next);
}
}
int main()
{
char result[15];
multicat(result,4,"123","45","6789","0");
printf("%s\n",result);
return 0;
}
23.01.2012, 19:36
gamecreator Wrote:честно - не пробовал. но не сомневаюсь в отсутствии семантических ошибок.Увы, ошибка.
инициализация была в предыдущем куске кода. а foo(a,8); и писать нечего.
Quote:пример должен быть уместен. напомню, ты начал доказывать, что без вектора Пакке понадобится знать операции с указателями и адресную арифметику. доводов в подтверждение этого я еще не услышал.Как это "не услышал"? Сам же и написал функцию, которая принимает на входе указатель

Quote:но перед тем, как учить матан, необходимо еще много узнать. дай Пакке сначала научиться программировать, а потом уже учи его особенностям языка.Дык это ж не просто "особенность", это одна из его ключевых фич. "Особенности" - это уже больше свойства каких-то конкретных бибилиотек, типа той же STL (вот в ней у каждого контейнера есть свои особенности).
Но в целом соглашусь, действительно ещё Пакке рановато в указатели вникать. Но я ему хотя бы глаза на них открыл

Quote:мне хватило попытки знакомства.Ну и что именно-то тебе в нём не понравилось?

P.S. За реализацию "второй" функции - респект, всё правильно.
23.01.2012, 20:07
А нет, Игродел - вру, не ошибка. Но твоя функция транспонирования работает лишь в том случае, если объявлять массив a так:
Но в реальности так массивы объявляют редко. Намного чаще объявление происходит как:
P.S. И ты ещё говоришь, будто "указателей в моём коде нету" - а сам при этом инициализируешь массив через new
P.S. Да и вообще, пусть Пакка узнает, что понятие "массив" в С++ - это почти то же самое, что и "указатель"
(а вот обратное неверно)
Code:
int **a;
const m = 5;
const n = 5;
a = new int*[m];
for(int i = 0; i < m; i++) a[i] = new int[n];
Но в реальности так массивы объявляют редко. Намного чаще объявление происходит как:
Code:
int a[5][5] = {
{0, 1, 2, 3, 4},
{6, 0, 1, 2, 3},
{7, 6, 0, 1, 2},
{8, 7, 6, 0, 1},
{9, 8, 7, 6, 0}};
это я сразу же данный массив заполнить решил, хотя можно было и просто int a[5][5]; написать
Вот для такого объявления твой код работать не будет...P.S. И ты ещё говоришь, будто "указателей в моём коде нету" - а сам при этом инициализируешь массив через new

P.S. Да и вообще, пусть Пакка узнает, что понятие "массив" в С++ - это почти то же самое, что и "указатель"

23.01.2012, 21:20
(23.01.2012 19:36)Efrit Wrote: [ -> ]Как это "не услышал"? Сам же и написал функцию, которая принимает на входе указательне просто указатель, а массив. да и это тут ни при чем. параметром функции он от этого быть не перестанет. а указатель там или что-то другое - без разницы, суть та же.
(23.01.2012 19:36)Efrit Wrote: [ -> ]Ну и что именно-то тебе в нём не понравилось?почем я помню? помню, что не понравилось
(23.01.2012 20:07)Efrit Wrote: [ -> ]Вот для такого объявления твой код работать не будет...надо было явно сказать что для статического. но арифметика указателей от этого не появится. хотя в универсальной функции уже будет не обойтись без работы с указателями:
Code:
void foo(void *p, int n, bool dynamic_array)
{
int tmp;
if(dynamic_array)
{
int **arr = (int**) p;
for(int i = 0; i < n; i++)
{
for(int k = i + 1; k < n; k++)
{
tmp = arr[i][k];
arr[i][k] = arr[k][i];
arr[k][i] = tmp;
}
}
}
else
{
int *arr = (int*) p;
int i1, i2;
for(int i = 0; i < n; i++)
{
for(int k = i + 1; k < n; k++)
{
i1 = i*n+k;
i2 = k*n+i;
tmp = arr[i1];
arr[i1] = arr[i2];
arr[i2] = tmp;
}
}
}
}
(23.01.2012 20:07)Efrit Wrote: [ -> ]И ты ещё говоришь, будто "указателей в моём коде нету" - а сам при этом инициализируешь массив через newпруф. я такого не говорил. я говорил что выделение и освобождение памяти за работу с указателями не считаю.
(23.01.2012 20:07)Efrit Wrote: [ -> ]Да и вообще, пусть Пакка узнает, что понятие "массив" в С++ - это почти то же самое, что и "указатель"да-да, все массивы - указатели. а вот насчет обратного - я бы сказал, что это зависит от задач. в тех же функциях с произвольным числом параметров указатель, не являвшийся массивом, может им стать.(а вот обратное неверно)