LINUX.ORG.RU

Тупняк и указатели 2

 


0

2

Я уже Вам надоел, да? Почти последний вопрос. Вопрос по «грамотности» указания элементов массива. Имеем

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define N 10
int main (){
	srand((unsigned)time(NULL));
	int **sq;
	sq=malloc(N*sizeof(int *));
	int i,j;
	for(i=0;i<N;i++){
	   //sq[i]=malloc(N*sizeof(int));
	   *(sq+i)=malloc(N*sizeof(int));
	   for(j=0;j<N;j++){
	       //sq[i][j]=rand();
	       *(*(sq+i)+j)=rand();
	   }
	}
	printf("%d\n",sq[5][5]);
	printf("%d\n",*(*(sq+5)+5));
	free(sq);
	return 0;
}
Как более внятно четко обращаться к элементу многомерного массива? sq[5][5] или *(*(sq+5)+5)? Да, и внесите Царя.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <u.h>
#include <libc.h>
#define N 10
#define sz (((N)+1)*(N))
int
main(){
	srand((unsigned)time(NULL));
        int *sq;
	if(NULL==(sq=malloc(sz*sizeof(int)))){
		sysfatal("ну ты понял %d int'ов: %r такие дела", sz);
	}
	int i,j;
	for(i=j=0,i<=(N);i++,j+=(N))sq[i]=j;
	for(i++;i<sz;sq[i++]=rand());
	printf("%d\n",0[sq+5][sq+5]);
	free(sq);
	return 0;
}

всем чмоки в этом чате;

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 2)
Ответ на: комментарий от qulinxao

free(sq);

фу таким быть

в след раз на собеседовании не освобождай память, скажи, что линакс это сделает быстрее и более лучше, ибо ты - ничтожество

anonymous
()
Ответ на: комментарий от int13h

так делал B

в си массив (который int[] но не в аргументах) это «константа» которая в коде - отдельного места хранения хранящего адрес массива нет.

при вычислениях же компилятор все упоминания массива «деградирует» до указателя на элемент.

qulinxao ★★☆
()
Ответ на: комментарий от Eddy_Em

А я вообще не программист. Нефиг тут!

Ну и зачем ты тогда раздаёшь всем свои вредные советы, неуклюже выставляя их за истину?

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

А потому что мою старую аватарку удалили, а с ней было лучше понятно.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от int13h

вообщет это совет , дословно из святых Патриархов.

пусть ваши программы падают чаще, уних утилезует трупиком.

т.е. реально внимательность с памятью нужна только в постоянно работающих (дрова и т.п да и там есть стратегия рестартов(которые не с ерланга появились))

qulinxao ★★☆
()

Вместо массива массивов лучше использовать одномерный массив с кастомной индексацией. Вот велосипед на С++ (без stdlib):


template <typename T>
class Matrix {
public:
    Matrix(size_t rows, size_t cols)
       : m_rows(rows), m_cols(cols),
       m_contents(new T[rows * cols]) 
    {
        memset((void *)contents, 0, rows * cols * sizeof(T));
    }
    
    inline T& at(size_t row, size_t col) {
        return m_contents[row * m_cols + col];
    }

    ~Matrix() {
        delete [] m_contents;
    }
private:
    size_t m_rows, m_cols;
    T *m_contents;
};

int main() {
    Matrix<int> m(10, 10);
    m.at(4, 4) = 42;

    cout << "m[4, 4] = " << m.at(4, 4) << endl;
}

KennyMinigun ★★★★★
()
Ответ на: комментарий от int13h

Ожидаю тему «Тупняк и указатели 3», с трехмерными массивами. :)

не будет.

А че? Сейчас модно 3D.

korvin_ ★★★★★
()
Ответ на: комментарий от int13h

На сколько оно будет быстрее чем мой быдлокод?

гораздо быстрее

yoghurt ★★★★★
()
Ответ на: комментарий от anonymous

в след раз на собеседовании не освобождай память

Смысл работать в говноконторах, где утечки под валгриндом не посмотреть без здоровенного игнорлиста? Снова 40 милисекунд фоновой нагрузки процессора экономим?

anonymous
()
Ответ на: комментарий от mix_mix

В линуксах realloc бесплатный почти, т.к. не перемещает данные даже если не смог расширить текущий блок.

Не реалок, а ммап/мрепам. На этом уровне, когда маллок работает как прокся ммап"а, нет никаких «блоков».

Маллок/реалок работает как прокся не всегда, а «>= 128KB by default», про это там указанно.

А ещё malloc() на «>= 128KB by default» выдаёт всегда нули, поэтому полезный едик даже с каллоком зафейлил.

Да и вообще, зачем надеяться на линукс и не юзать mmap() на прямую?

anonymous
()

Господи, да пишите вы на C++ в конце концов, если тут такие вопросы то я уверен во всем другом коде у тебя не меньше проблем которых ты не видишь.

bhfq ★★★★★
()
Ответ на: комментарий от qulinxao

Откуда ты вылезло, ничтожество?

(((N)+1)*(N))

Щито? Ублюдок рещил со своим скудоумием почитать длину N*N, а зачем + 1?

if(NULL==(sq=malloc(sz*sizeof(int)))){

Просто ублюдок, какбэ до ! ты ещё не дошел?

for(i=j=0,i<=(N);i++,j+=(N))sq[i]=j;
//       ^  ^- просто мразь, ты слепя чтоли? Либо ты настолько тупая, что ; и , перепутала?

//У тебя индекс с нуля, какого ты лепишь sq[10], когда у тебя длинна лайнов N == 10, а sq[10] - это 11-й лайн.

for(i++;i<sz;sq[i++]=rand());

А какого хрена, ты, ублюдок, лепишь rand() с хрен пойми какого елемента, если у ТС"а с первого?

printf(«%d\n»,0[sq+5][sq+5]);

Ты изучило вчера «новые возможности» и пихаешь куда не попадя, чтобы показать что ты что-то там эти возможности знаешь? Полезно, просто ущербанище лесное.

Я конечно понимаю, что ты со своим скудоумием пыталось понтануться и показать что твой «скилл» решения лаб что-то значит, но не фортануло, засунув множители для строк в первые елементы, только вот даунёнок - 0[sq+5][sq+5] - это не 55-й елемент, а 55 с нуля, когда как у тебя начало с 10-го(хотя ты тупая мразь даже с 10-го осилить не смог).

Ну и да, понты гнилые и бездарные. А вся суть в том, что не получилось с 0[sq+5][sq+5] без говна? Ну дак это не нужно.

  for(int i = 0; i < N;++i) sq[i] = (i + 1/*Ублюдок, с еденицы*/) * N;
  for(int i = N; i < sz; ++i) sq[i] = (i - N);//если ты хочешь проверить своё говно - заполняй его правильно.
  printf("%d\n",0[sq+5][sq+5]);

В этом суть, обезьяна просто не способна к реальному программированию - твой удел пхп, я тебе уже не раз это говорил.

anonymous
()
Ответ на: комментарий от anonymous

Если маллок в твоей либц не проксирует большие кусчки через ммап, то выкинь его.

Это кастыль исправляющий фатальный недостаток брк-маллока, а все либцешные маллоки бркашные:

Для справочки p = malloc(10ГБ);p1 = malloc(10);free(p);

А так да, тут говорится про глибц.

anonymous
()
Ответ на: комментарий от anonymous

давай, ещё,

а фишка 0[base+ind1][base+ind2]......[base+indN]

в использовании плоского(одномерного) массива как полного аналога памяти однако без использования типа указателя.

т.е если в ячейке «указатель» его как базу 0......[base+...]

т.е на одномерном массиве можно какие угодно структуры эмулировать - всё как всегда @ФОРТРАН овладевает@

ps. за внимательность возьми с полки пирожок.

pps. найди отца.

qulinxao ★★☆
()
Ответ на: комментарий от bhfq

Господи, да пишите вы на C++

И что мне даст С++? Ты хоть 5% от того, что я могу осилишь на плюсах( без свича в «с89 входит в кресты»)?

если тут такие вопросы то я уверен во всем другом коде у тебя не меньше проблем которых ты не видишь.

А в чем тут проблема?

Какраз-таки в твоём коде столько проблем о которых ты даже не подозреваешь, что ТС"у до вас как до луны пешком.

А почему ты их не видишь - ты уже сам ответил, в попытке научить пацанов, как сбросить всё на ЯП и готовенькое.

anonymous
()
Ответ на: комментарий от qulinxao

а фишка 0[base+ind1][base+ind2]......[base+indN]

Ты меня ещё поучи.

в использовании плоского(одномерного) массива как полного аналога памяти однако без использования типа указателя.

Щито?

т.е если в ячейке «указатель» его как базу 0......[base+...]

Ты зачем это мне рассказываешь? Если я это запилил не обосравшись, а ты обосравшись?

т.е на одномерном массиве можно какие угодно структуры эмулировать - всё как всегда @ФОРТРАН овладевает@

Ты не эмулируешь, ты сваял говно, причем неправильно.

Ещё раз, ты пытаешься эмулировать не «структуру» эмулировать, а индексацию, ибо в сишке ptr[][] работает не так, как ожидает этого обезьяна.

Вся суть твоего говна - рабочие скобочки, но если ты и этого не понимаешь - из какого зоопарка ты вылез?

Причем тут фортран, причем тут структуры? Давай я объясню для даунов:

int m[N][N];
m[2][5];// раскрывается в m + N * 2 + 5;
int * ptr;
ptr[2][5];//раскрывается в *(*(ptr + 2) + 5)
0[ptr][ptr]//раскрывается в *(*(ptr + 0) + ptr)

В этом фейл. ptr[][] - сдесь на второй скобочке значения указателя(базы - ptr) теряется, и ты вынужден в разименованном елементе хранить эту базу, ибо у тебя смешением является индекс.

В случае же с 0[ptr][ptr] - у тебя на второй скобочке так же теряется значение указателя(базы - ptr), но у тебя юзается база как смешение. Т.е. (sq[5] + sq)[5]

Т.е. ты хранишь вместо указателя - смешение, а базу пишешь в скобку. Эту возможность сишки(а вернее сложения) ты юзаешь как кастыль для того, чтобы работали скобки.

С таким же успехом, если база влезает в елемент - ты можешь хранить базу.

И никакие фортраны тут непричем - ты поменял базу и смешение местами.

ps. за внимательность возьми с полки пирожок.

Это не внимательность, это какая-то обезьяна возомнила себе, что она осилить хотябы хелворд написать, но не фортануло.

pps. найди отца.

Зачем мне кого-то искатЬ? Ты же мне расскажешь?

anonymous
()
Ответ на: комментарий от Pavval

ОП, а почему ты нам, таким себе серьезным и состоятельным людям, показываешь прогу с утечкой памяти?

free здесь не нужен, OS освободит все ресурсы по завершению программы. Так-то, анскилыши.

anonymous
()
Ответ на: комментарий от anonymous

А вот и царевна-лягушка подтянулась.

anonymous
()
Ответ на: комментарий от bhfq

а кода нет. просто пока медленно пишу такие хелловорды-быдлокоды. я понимаю, что они [пока] есть быдлокод птушника, но в дальнейшем хочу прокачать скилл и использовать в определенной области.

int13h ★★★★★
() автор топика
Ответ на: комментарий от anonymous

у sizeofPgIfNeed[b+ind1][b+ind2] ....

есть то преимущество в сравнении с b[ind1][ind2]...

что

что в первом случае у нас всегда 1 декларация b как одномерного массива (читай плоской памяти) и можно к селектору наворачивать любоё различное число «косвенностей» и «тип» всегда один - тип элемента в отличии от

b[ind1] , b[ind1][ind2] , b[ind1][ind2][ind3] - всё разного числа косвенностей указатели и тип конечного элемента в случае совпадения числа индексов с обьявлением.

плата за это: хранение в самом массиве «указателей» вместе с данными .

[] такая же «локализация» выражения , что и ->

без них (тока через *) скобки(для задания должного порядка) разбегаются по краям выражения.

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)
Ответ на: комментарий от int13h

Купи себе недорогой микроконтроллер и пробуй под него писать. Тогда выработаешь бережное отношение к памяти и пренебрежение к кривым левым библиотекам.

Иначе получится очередной быдлокодер.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от int13h

Вот, устанавливай avr-gcc и вперед! Не вздумай пользоваться ардуйневскими "скетчами", только хуже себе сделаешь!

// кстати, дороговатые эти атмелы. Макетки на чипах от STM с такой же (или даже лучшей) конфигурацией значительно дешевле. Ардуйня разве что берет тем, что даже 8-битники от атмеля имеют бутлоадер. И во многих есть поддержка USB, а бутлоадер работает прямо через "родной" USB, т.е. не надо прилепливать дополнительный переходничок.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от int13h

Смотря для каких целей.

Если просто подрыгать ногами, ну и что-нибудь элементарное подключить, то можно взять восьмибитный на STM8S103/105 (S003 не бери, у него дерьмовая флешь, поэтому такой дешевый — гарантированно только 100 циклов перезаписи держит). Но к нему нужно будет еще взять переходничок USB<->TTL за 1 доллар.

Если хочешь побольше периферии + 32бита + встроенный USB, бери что-нибудь на STM32F1xx.

Если еще и ethernet хочешь, да и аппаратные вычисления с плавающей запятой, то придется уже дофига выложить: демо-платы на STM32F407 дорогие.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от qulinxao

если тебе указыать на все твои нелепости (не только в коде, но и в рузге языке), на лоре базы порвутся

anonymous
()
Ответ на: комментарий от int13h

Уж не собрался ты к советам Эдика прислушиваться?

templarrr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.