Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / C++ |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 4 вперед Ctrl→ все |
patrick1968 Member Откуда: Сообщений: 500 |
Добрый день. Возникла тут у меня необходимость перевести одну программу с Делфи на Си, так не сложная но тем не менее. Си практически не знаю, так на допотопном уровне, естественно прошу помощи. есть фрагмент Делфи uses IniFiles; ... var PSIni : TInifile; ... PSIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'PNG.ini'); Как это будет выглядеть на Си. Сорри за банальность. Спасибо. Сообщение было отредактировано: 10 мар 21, 18:53 |
2 мар 21, 17:09 [22288523] Ответить | Цитировать Сообщить модератору |
ъъъъъ Member Откуда: Сообщений: 1966 |
Это смотря для чего тебе нужен TIniFile. Например, запись строки данных в .ini фал может выглядеть так: #include <Windows.h> #include <filesystem> #include <iostream> using namespace std; int wmain(int argc, wchar_t * argv[]) { filesystem::path curr = filesystem::path(argv[0]).remove_filename().append(L"PNG.ini"); wchar_t division [] = L"Мясные изделия"; wchar_t type [] = L"Колбаса"; wchar_t name [] = L"Брауншвейгская"; wcout << L"Lines written: " << WritePrivateProfileStringW(division, type, name, curr.c_str()) << endl; К сообщению приложен файл. Размер - 37Kb |
||||
2 мар 21, 18:36 [22288576] Ответить | Цитировать Сообщить модератору |
Siemargl Member Откуда: 010100 Сообщений: 6422 |
Используй C++ Builder, там такое же API. Иначе устанешь переписывать. |
||||
2 мар 21, 19:26 [22288620] Ответить | Цитировать Сообщить модератору |
patrick1968 Member Откуда: Сообщений: 500 |
Я в принципе так и делаю. Спасибо. |
2 мар 21, 22:50 [22288705] Ответить | Цитировать Сообщить модератору |
ну я Member Откуда: Москва Сообщений: 1255 |
#include "IniFiles.hpp" TIniFile* PSIni; PSIni = new TIniFile(ExtractFilePath(ParamStr(0)) + "PNG.ini"); Сообщение было отредактировано: 10 мар 21, 18:54 |
||||
9 мар 21, 17:45 [22291905] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34688 |
#include "IniFiles.h" //... TInifile* PSIni; //... PSIni = new TIniFile(ExtractFilePath(ParamStr(0)) + "PNG.ini"); уверен, тебе стало легче... |
||||
10 мар 21, 09:58 [22292107] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34688 |
Блин, я опоздал ): |
||||||||
10 мар 21, 09:59 [22292108] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Но в этот раз намного меньше чем обычно. Прогресс. Posted via ActualForum NNTP Server 1.5 |
||
10 мар 21, 13:34 [22292350] Ответить | Цитировать Сообщить модератору |
Siemargl Member Откуда: 010100 Сообщений: 6422 |
Кстати, Билдер дотянули до С++17, прогресс Сообщение было отредактировано: 10 мар 21, 18:54 |
|||||||||
10 мар 21, 13:45 [22292361] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Просто в качестве компилятора взяли clang. Posted via ActualForum NNTP Server 1.5 |
10 мар 21, 13:47 [22292364] Ответить | Цитировать Сообщить модератору |
Siemargl Member Откуда: 010100 Сообщений: 6422 |
Не просто взяли, там же фирменные расширения были. Допиленный он там. Правда, был очень отстающим по версии, что то вроде clang 3.4 в Берлине. Upd 5.0 в Сиднее Сообщение было отредактировано: 10 мар 21, 13:52 |
||||
10 мар 21, 13:52 [22292369] Ответить | Цитировать Сообщить модератору |
patrick1968 Member Откуда: Сообщений: 500 |
Продолжаю перенос проги на С Buider из Delphi и естественно "уперся" прошу помощи, итак есть у меня в Делфи структура TInfo = record TypeID : integer; Name : string; Article : string; Mark : string; MinMeas : single; MaxMeas : single; PC20 : single; PC60 : single; PC100 : single; Delta : single; end; есть еще следующий класс, соответственно конструктор и функция для чтения TInfoObj = class(TObject) private sStr : TInfo; function GetValue : TInfo; public constructor Create( TypeID : integer; Name : string; Article : string; Mark : string; MinMeas : single; MaxMeas : single; PC20 : single; PC60 : single; PC100 : single; Delta : single ); property pValue : TInfo read GetValue; end; ... implementation {$R *.dfm} uses DataModule, Confirm, TypeDevice, DBView, TypeStand; constructor TInfoObj.Create( TypeID : integer; Name : string; Article : string; Mark : string; MinMeas : single; MaxMeas : single; PC20 : single; PC60 : single; PC100 : single; Delta : single); begin inherited Create; sStr.TypeID := TypeID; sStr.Name := Name; sStr.Article := Article; sStr.Mark := Mark; sStr.MinMeas := MinMeas; sStr.MaxMeas := MaxMeas; sStr.PC20 := PC20; sStr.PC60 := PC60; sStr.PC100 := PC100; sStr.Delta := Delta; end; function TInfoObj.GetValue : TInfo; begin Result := sStr; end; далее в программе я из запроса, данные записываю а объекты строк Комбобокса, if MainDataModule.qTypeDevice.Active then MainDataModule.qTypeDevice.Close; MainDataModule.qTypeDevice.Prepared := true; MainDataModule.qTypeDevice.Parameters.ParamByName('@Option').Value := 0; MainDataModule.qTypeDevice.Open; cbTypeDevice.Items.Clear; while not MainDataModule.qTypeDevice.Eof do begin With MainDataModule.qTypeDevice do begin vInfo := TInfoObj.Create(FieldByName('TypeID').AsInteger, FieldByName('Name').AsString, FieldByName('Article').AsString, FieldByName('Mark').AsString, FieldByName('MinMeas').AsFloat, FieldByName('MaxMeas').AsFloat, FieldByName('PC20').AsFloat, FieldByName('PC60').AsFloat, FieldByName('PC100').AsFloat, FieldByName('Delta').AsFloat); cbTypeDevice.Items.AddObject(FieldByName('Name').AsString + ' ' + FieldByName('Article').AsString, vInfo); end; MainDataModule.qTypeDevice.Next; end; MainDataModule.qTypeDevice.Close; ну и потом где надо я их читаю Info := TInfoObj(cbTypeDevice.Items.Objects[cbTypeDevice.ItemIndex]); как весь этот процесс организовать в C Builder, структуру створил struct _TypeDevice { int TypeID; AnsiString Name; AnsiString Article; AnsiString Mark; double MinMeas; double MaxMeas; double PC20; double PC60; double PC100; double Delta; } TypeDevice; наверное правильно, а вот дальше, конструкторы и прочее? никак. Заранее сильно благодарен |
10 мар 21, 17:55 [22292597] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
patrick1968, Один в один и пиши. Вверху строка дельфи а внизу сишная. Языки очень похожи. Это не пыха)) Конструктор сишный забыл? |
10 мар 21, 18:02 [22292603] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Страуструп "Язык программирования C++". ~1100 страниц. 10-ть страниц утром, 10-ть страниц вечером. Задания выполнять не надо, но нужно подумать как бы ты их делал. |
10 мар 21, 19:14 [22292644] Ответить | Цитировать Сообщить модератору |
miksoft Member Откуда: Сообщений: 38773 |
|
||||
10 мар 21, 19:21 [22292647] Ответить | Цитировать Сообщить модератору |
Siemargl Member Откуда: 010100 Сообщений: 6422 |
Но какой либо базовый учебник по С++ 2003, без подробностей, придется прочитать. Там делов на денёк, если не лезть в новые стандарты (с++11 и новее). Сообщение было отредактировано: 10 мар 21, 23:36 |
|||||||||
10 мар 21, 22:35 [22292724] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Но... это и в самом деле так просто. Что именно у тебя не получилось?
Откуда там "денёк", если всё реально делается тупым подстрочным переводом конструкций. Я бы понял если бы там задействовались возможности, отсутствующие в С++, типа создания объекта заранее неизвестного класса и всё такое, но код же переводится 1-в-1. Сообщение было отредактировано: 10 мар 21, 23:36 |
|||||
10 мар 21, 23:12 [22292743] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Очевидно же что тупой заменой begin/end -> {} и := -> = там мало чего можно добиться. Например, ключевое слово `with`. Я о нём регулярно вспоминаю, только не помню что я вспоминаю: Паскаль или C#. :) while not MainDataModule.qTypeDevice.Eof do begin With MainDataModule.qTypeDevice do begin |
||||
11 мар 21, 00:27 [22292770] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
А что с ним? Берётся текст вплоть до do, куть здеся - пасть всюду до самого end. Posted via ActualForum NNTP Server 1.5 |
||
11 мар 21, 01:19 [22292775] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Так это же знать нужно. Там в паскалевском коде ещё куча приколов. Вызов методов без кавычек (что-то бейсик вспомнился), кавычки одинарные на двойные заменить. Короче, знать нужно обое два языка. Простой заменой не обойдёшься. Только книга! |
||||||
11 мар 21, 01:30 [22292779] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Вызов методов без скобок, в смысле. |
11 мар 21, 01:34 [22292780] Ответить | Цитировать Сообщить модератору |
Пётр Седов Member Откуда: Санкт-Петербург Сообщений: 700 |
struct TypeDevice {
...
};
Delphi-ийский тип single соответствует C++-ному типу float (размер 4 байта).Оборачивать структуру TypeDevice в класс, производный от класса TObject, необязательно. Перепишите Delphi-код без with, в C++ аналога нет. Потом всё просто. В цикле: // создаём экземпляр структуры TypeDevice TypeDevice* info = new TypeDevice; // достаём поля info->TypeID = FieldByName("TypeID")->AsInteger; ... // добавляем info в combo box cbTypeDevice->Items->AddObject(FieldByName("Name")->AsString + " " + FieldByName("Article")->AsString, reinterpret_cast<TObject*>(info)); Потом, чтобы достать info из combo box-а:
TypeDevice* info = reinterpret_cast<TypeDevice*>(cbTypeDevice->Items->Objects[cbTypeDevice->ItemIndex]);
Потом, по-хорошему, перед уничтожением combo box-а, надо пройтись в цикле, и уничтожить все созданные экземпляры структуры TypeDevice: for (int i = 0; i < cbTypeDevice->Items->Count; i++) { TypeDevice* info = reinterpret_cast<TypeDevice*>(cbTypeDevice->Items->Objects[i]); delete info; }Можно это не делать, но тогда будет утечка памяти. |
||||
11 мар 21, 01:50 [22292781] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
|
||||
11 мар 21, 07:06 [22292801] Ответить | Цитировать Сообщить модератору |
patrick1968 Member Откуда: Сообщений: 500 |
Добрый день. Петру Седову огромное спасибо. Вот это реальная помощь и ничего лишнего. Большой респект!!! |
14 мар 21, 14:24 [22294256] Ответить | Цитировать Сообщить модератору |
patrick1968 Member Откуда: Сообщений: 500 |
Добрый день. Знатоки подскажите плиз, где RAD STUDIO содержит Temp файлы, а то у меня рабочий проект вдруг свалился в "Error detected (LME288) Unable to perform link", на форумах погуглил - рекомендуют темп вычистить и проект пересобрать |
16 мар 21, 18:53 [22295736] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 4 вперед Ctrl→ все |
Все форумы / C++ | ![]() |