powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си. Освободить память 2-мерного сторкового массива
25 сообщений из 308, страница 12 из 13
Си. Освободить память 2-мерного сторкового массива
    #40134248
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А потом ещё можно почитать про getaddrinfo() и IPv6. И выкинуть всю эту
массивную фигню чуть более чем целиком, потому что для задачи она не нужна.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134274
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непонятная ситуация:

вот файл

header.h

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <libpq-fe.h>

struct pair {
	char* name;
	char* ip;
};




Создал функцию в отдельном файле:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#include "header.h"

int get_retails()
}
    printf("Я функция\n");
	return 0;
}





При компиляции пишет:

error: expected declaration specifiers before ‘printf’
printf("здравствуй, мир\n");


Как буд-то

Код: plaintext
1.
#include <stdio.h>



не прописан в новом файле.

Но он же должен подтягиваться из заголовочного файла строчкой:

Код: plaintext
1.
#include "header.h"



А почему не подтягивается?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134275
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут какая-то фигня. Bracer не в ту сторону.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#include "header.h"

int get_retails()
}
    printf("Я функция\n");
	return 0;
}



Ты в среде разработки пишешь?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134284
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Тут какая-то фигня. Bracer не в ту сторону.

Ты в среде разработки пишешь?


А вот оно в чем дело...


Поменял на { - все скомпилировалось!

Спасибо )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134285
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton


Ты в среде разработки пишешь?


не, я в блокноте пишу.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134362
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
mayton


Ты в среде разработки пишешь?


не, я в блокноте пишу.

вижуал студию поставь, писать научишься - продолжишь в блокноте
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134378
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я начинал с Borland C++ под DOS но я не помню была ли там подсветка парных bracers?

Кто помнит?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134405
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Я начинал с Borland C++ под DOS но я не помню была ли там подсветка парных bracers?

Кто помнит?
Нет, точно нет. Там была раскраска ключевых слов, но динамической подсветки парных скобок не было.

Впрочем, она появилась довольно давно - в lisp-машинах, и кажется еще в 80-х. Но точно, не уверен.
Я сам ей пользоваться начал только в начале века, в FAR. Когда colorer набрал популярность.
А потом и всяческие IDE подтянулись.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134430
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Я сам ей пользоваться начал только в начале века, в FAR. Когда colorer набрал популярность.

Нынче colorer по умолчанию с Far ставится. Еще есть notepad++, там тоже подсветка синтаксиса.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134745
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро.

Столкнулся с непонятной ситуацией.

Заменил тип в структуре с char* на int и память для ячейки структуры перестала выделяться.

Вот такая структура и массив из структур:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct pair {
	char* name;
	char* ip;
        int status;
};

struct pair *arr;






Было так на i-м шаге в цикле:
Код: plaintext
1.
arr[i].status=(char*)malloc(10*sizeof(char*));






Стало так:
Код: plaintext
1.
arr[i].status=(int)malloc(sizeof(int));




Ошибка вот такая:

warning: cast from pointer to integer of different size



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

Скажите, это нормально, не выделять память для int в массиве структур?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134750
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под примитивные типы не надо выделять память. Они уже есть в структуре как ее часть.


Код: plaintext
1.
arr[i].status=42;
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134762
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Под примитивные типы не надо выделять память. Они уже есть в структуре как ее часть.


Код: plaintext
1.
arr[i].status=42;




Получается под char тоже не надо, только под char*

Понял, спасибо :-)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134763
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй нарисуй на бумажке как ты себе представляешь память в виде дампа
и где в ней лежит твой массив структур и выделенные строки. Где указатели.
Какова их разрядность. Где padding.

Это очень быстро освежает мозг и позволяет сразу другим наблюдателям понять где ты ошибаешся и где что не так.
Иначе заблуждения пойдут далеко.

Я так делал когда был студентом и изучал Borland C++.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134764
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Ошибка вот такая:

warning: cast from pointer to integer of different size



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

Скажите, это нормально, не выделять память для int в массиве структур?

Ты утечку памяти устроил, компилятор об этом предупредил.

Если у тебя указатель (тип со звездочкой*), то это адрес в памяти где лежат данные этого типа (или массив). Без звездочки (не указатель) это уже выделенное место в памяти под переменную данного типа. Т.е. если у тебя тип int, то дополнительно ничего выделять не надо.

Указатель это тоже переменная, под нее тоже сразу выделяется память (8 байт в x64) и в эту память пишется адрес на который указывает указатель, т.е. тот адрес который вернет malloc() в твоем коде.

PS Про указатели почитай https://metanit.com/cpp/c/5.1.php
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134795
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton, Dima T, впитываю информацию, спасибо :-)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40136844
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро.

Появилась вот такая проблема:

в строку

Код: plaintext
1.
char* str_temp;



попадает значение из функции

Код: plaintext
1.
PQerrorMessage(conn); 



типа:

Код: plaintext
1.
"...port 5432 failed: &#9618;&#9618;&#9618;&#9618;&#9618;:  &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618; "postgres" &#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618; (&#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;)..."



А потом я пытаюсь это вставить в sql запрос и выпадает ошибка:

что строка содержит символ, не соответствующий utf-8


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

Код: plaintext
1.
strlcpy(str_temp, PQerrorMessage(conn), 1);




о там получается 1 нормльный символ, а потом еще како-то спецсимвол и такая же ошибка с utf-8



Подскажите пожалуйста как привести строку в соответствие с utf-8 ?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137275
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уткъ
Доброе утро.

Появилась вот такая проблема:

в строку

Код: plaintext
1.
char* str_temp;



попадает значение из функции

Код: plaintext
1.
PQerrorMessage(conn); 



типа:

Код: plaintext
1.
"...port 5432 failed: &#9618;&#9618;&#9618;&#9618;&#9618;:  &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618; "postgres" &#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618; (&#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;)..."



А потом я пытаюсь это вставить в sql запрос и выпадает ошибка:

что строка содержит символ, не соответствующий utf-8


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

Код: plaintext
1.
strlcpy(str_temp, PQerrorMessage(conn), 1);




о там получается 1 нормльный символ, а потом еще како-то спецсимвол и такая же ошибка с utf-8



Подскажите пожалуйста как привести строку в соответствие с utf-8 ?



Думаю посимвольно строку перебрать и оставить только те символы, которые к utf-8 относятся.

Но как понять относится символ к utf-8 или нет?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137286
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажи код. Декодировать вручную utf-8 не нужно. Что-то выше по коду было не так.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137294
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Покажи код. Декодировать вручную utf-8 не нужно. Что-то выше по коду было не так.


Тут дело такое.

Весь код довольно большой и слабочитаемый, тем более там специфическая библиотека. Особо нет смысла его приводить.

Код устроен так:

1) в char* переменную считывается сообщение об ошибке из функции libpq - PQerrorMessage().

2) это сообщение содержит руские буквы и спецсимволы.

3) формирую запрос на INSERT в БД. И в него через strcat() вставляю это сообщение.

4) ошибка об utf-8 именно от БД postgresql , её не Си выдает.

Получается, если сообщение об ошибке на английском - INSERT в БД проходит без проблем.
Если на русском, то он не проходит и программа работает дальше, просто нет записи в БД.
Надеюсь передал суть проблемы )


Задача: обработать эту переменную со спецсимволами, убрав их.
Оставить только символы, которые есть в utf-8
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137307
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй в строке коннекта явно указать кодировку

Код: plaintext
1.
postgresql://host1:123/............&client_encoding=
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137311
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Задача: обработать эту переменную со спецсимволами, убрав их.
Оставить только символы, которые есть в utf-8

Все символы с кодами от 32 до 127 одинаковы в кодировке ANSI и UTF-8, остальные убрать можно так:
Код: plaintext
1.
2.
3.
for(char* p = str_temp;*p != 0; p++) {
    if(*p < 32) p = '?';
}


но так ты все русские буквы на вопросики заменишь.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137351
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Задача: обработать эту переменную со спецсимволами, убрав их.
Оставить только символы, которые есть в utf-8

Все символы с кодами от 32 до 127 одинаковы в кодировке ANSI и UTF-8, остальные убрать можно так:
Код: plaintext
1.
2.
3.
for(char* p = str_temp;*p != 0; p++) {
    if(*p < 32) p = '?';
}


но так ты все русские буквы на вопросики заменишь.



Вопросики - не страшно.

Это похоже то что нужно.

Спасибо :-)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137354
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Попробуй в строке коннекта явно указать кодировку

Код: plaintext
1.
postgresql://host1:123/............&client_encoding=




Спасибо, проверю отпишусь.

Сейчас просто не за компом.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137377
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Задача: обработать эту переменную со спецсимволами, убрав их.
Оставить только символы, которые есть в utf-8

Все символы с кодами от 32 до 127 одинаковы в кодировке ANSI и UTF-8, остальные убрать можно так:
Код: plaintext
1.
2.
3.
for(char* p = str_temp;*p != 0; p++) {
    if(*p < 32) p = '?';
}


но так ты все русские буквы на вопросики заменишь.




Ура, сработало!


Правда немного изменил:

Код: plaintext
1.
2.
3.
4.
5.
6.
char* str_temp=(char *)malloc(5000);
char* p=(char *)malloc(5000);

for(p = str_temp;*p != 0; p++) {
    if(*p < 32) {*p = '?';}
}



Большое спасибо!

Чуть позднее еще с кодировкой попробую.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137380
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ

Правда немного изменил:

Код: plaintext
1.
2.
3.
4.
5.
6.
char* str_temp=(char *)malloc(5000);
char* p=(char *)malloc(5000);

for(p = str_temp;*p != 0; p++) {
    if(*p < 32) {*p = '?';}
}

Маладэц! Организовал утечку памяти.
Компилятор на такое, кстати, ругаться должен. Ты эту ругань проигнорировал?
...
Рейтинг: 0 / 0
25 сообщений из 308, страница 12 из 13
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си. Освободить память 2-мерного сторкового массива
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]