Wake of Gods Forum | Форум Во Имя Богов

Full Version: С++, общая тема
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
etoprostoya, ну и где здесь функция? Spiteful
Quote:Пакка, ты внимательно читаешь мои сообщения? Rolleyes Я же прямо указал тебе в сообщении 55, что ошибка связана со строкой Img[i]=new TImage(this) - она слишком низко стоит, ты создаёшь объект после обращения к нему. Даже пурпурным цветом её тогда выделил Ab
Гм, не знаю по какой причине, но я прочитал только это))) :

Quote:Частично я уже указал тебе на твою ошибку, смотри пункт 3 моих рекомендаций. Ты не заполняешь в массиве bh элементы вида bh[i][0] числами, и поэтому они принимают значение по умолчанию - то бишь 0. Поэтому, строчка с case 0 всегда срабатывает уже для самого первого элемента массива bh (то бишь, для bh[0][0]). А что в ней происходит? Ты пытаешься (через указатель) обратиться к элементу, который ещё не создан!
Вследствие чего не совсем допонял, и сделал неправильный вывод.
Quote:Кстати, а ты вообще понимаешь, что именно делает эта строка?

Теперь да, тогда нет Sm
Точнее догадаться мог, это довольно просто, но я просто не обращал на нее внимания. Да, мне стыдно...
(23.01.2012 12:30)Efrit Wrote: [ -> ]etoprostoya, ну и где здесь функция? Spiteful

А по существу? Добавь оболочку для функции, которая не влияет на саму возможность обращаться к элементам массивов без использования адресной арифметики.
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;
          }
}
packa, теперь всё понятно Ab
И всё-таки, ради интереса ответь - что же именно, на твой взгляд, делается в той строке 118

etoprostoya, а где в твоей функции массив-то? arr - это какой-то конкретный глобальный массив, он не в счёт. А я, разумеется, имел в виду реализацию функции, которая транспонирует любой входной двумерный массив (любого размера)...
Quote:NumImg=8;
Img=new TImage*[NumImg];
Резервируем место под 8 элементов
Quote:Img[i]=new TImage(this);
Создаем картинку (пустую), на данном элементе (на форме)
Quote:case 4 : Img[i]->Picture->LoadFromFile("14.bmp"); break;
Заполняем картинку картинкой)

Вот так я понял
Про любой размер массива речи не было:
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;
           }
}
Опять придерёшься к чему-то, что не было оговорено? Sm
(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: [ -> ]я погуглил и нашёл, что ВСЁ во ВСЕХ языках программирования - зло. Деньги, кстати, тоже зло.
но в яп нет денег Bad
packa, ты понял не совсем правильно. Команда new не просто "создала картинку" - она вызвала конструктор класса TImage, который как раз и создал объект "картинка", и затем вернула указатель на этот объект. Пойми, что Img - это массив указателей (причём ты его весьма коряво создаёшь, ну да ладно), а не массив объектов. А дальше ты просто обращаешься к объекту "картинка" (созданному конструктором) через указатель на него.
надеюсь, ты вообще знаешь, что такое "указатель"? Sm

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

gamecreator, ты пробовал запускать свою функцию? Напиши-ка ещё инициализацию входного массива и строчку вызова самой функции, ну чисто ради интереса Rolleyes

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

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

Quote:почему в начальных классах не рассказывают матан?
Если человек хочет хорошо знать математику, то матан ему учить придётся. То же самое и здесь. Тем более, что работа с указателями - это не такая уж и сложная штука. То же истанцирование шаблонов - куда сложнее.

Quote:плохое впечатление
И что же там такого плохого? Неужели ты смотрел весь Буст целиком?
Quote:Пакки
Респект дружище!)))

Quote:надеюсь, ты вообще знаешь, что такое "указатель"?
Слышал где то Rolleyes
(23.01.2012 18:23)Efrit Wrote: [ -> ]ты пробовал запускать свою функцию?
честно - не пробовал. но не сомневаюсь в отсутствии семантических ошибок.
(23.01.2012 18:23)Efrit Wrote: [ -> ]Напиши-ка ещё инициализацию входного массива и строчку вызова самой функции, ну чисто ради интереса Rolleyes
инициализация была в предыдущем куске кода. а 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: [ -> ]Ну давай, реализуй4
ок, будет.
(23.01.2012 18:23)Efrit Wrote: [ -> ]Если человек хочет хорошо знать математику, то матан ему учить придётся.
но перед тем, как учить матан, необходимо еще много узнать. дай Пакке сначала научиться программировать, а потом уже учи его особенностям языка.
(23.01.2012 18:23)Efrit Wrote: [ -> ]И что же там такого плохого? Неужели ты смотрел весь Буст целиком?
мне хватило попытки знакомства.
(23.01.2012 17:23)gamecreator Wrote: [ -> ]но в яп нет денег Bad
:D Ну я имел в виду, что деньги-то зло, а всё равно нужны Sm
(23.01.2012 18:23)Efrit Wrote: [ -> ]Ну давай, реализуй4
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;
}
gamecreator Wrote:честно - не пробовал. но не сомневаюсь в отсутствии семантических ошибок.
инициализация была в предыдущем куске кода. а foo(a,8); и писать нечего.
Увы, ошибка.

Quote:пример должен быть уместен. напомню, ты начал доказывать, что без вектора Пакке понадобится знать операции с указателями и адресную арифметику. доводов в подтверждение этого я еще не услышал.
Как это "не услышал"? Сам же и написал функцию, которая принимает на входе указатель 96-copy

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

Но в целом соглашусь, действительно ещё Пакке рановато в указатели вникать. Но я ему хотя бы глаза на них открыл Ab Пусть знает, что рано или поздно ему придётся с ними плотно познакомиться.

Quote:мне хватило попытки знакомства.
Ну и что именно-то тебе в нём не понравилось? 105 Блин, словно клещами информацию из тебя выжимаю...

P.S. За реализацию "второй" функции - респект, всё правильно.
А нет, Игродел - вру, не ошибка. Но твоя функция транспонирования работает лишь в том случае, если объявлять массив a так:

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 Ab
P.S. Да и вообще, пусть Пакка узнает, что понятие "массив" в С++ - это почти то же самое, что и "указатель" Ab (а вот обратное неверно)
(23.01.2012 19:36)Efrit Wrote: [ -> ]Как это "не услышал"? Сам же и написал функцию, которая принимает на входе указатель 96-copy
не просто указатель, а массив. да и это тут ни при чем. параметром функции он от этого быть не перестанет. а указатель там или что-то другое - без разницы, суть та же.
(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 Ab
пруф. я такого не говорил. я говорил что выделение и освобождение памяти за работу с указателями не считаю.
(23.01.2012 20:07)Efrit Wrote: [ -> ]Да и вообще, пусть Пакка узнает, что понятие "массив" в С++ - это почти то же самое, что и "указатель" Ab (а вот обратное неверно)
да-да, все массивы - указатели. а вот насчет обратного - я бы сказал, что это зависит от задач. в тех же функциях с произвольным числом параметров указатель, не являвшийся массивом, может им стать.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
Reference URL's