Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2021, 12:23   #1
Leonid17
 
Регистрация: 12.01.2021
Сообщений: 6
Вопрос Массив не выгружается в память.

Здравствуйте, уважаемые форумчане.

(Небольшое введение) В данный момент я собираю лабораторный стенд на базе другой установки, софт к которой написан на С++. Её дизайнеры так же написали библиотеки под эту установку для упрощения её использования в новых задачах. Так получилось, что в С++ я не понимал до этого ничего, потихоньку стал разбираться, уже написал что-то, добился того, что установка со мной разговаривает через код. Отвечает, что всё хорошо, но одна функция, необходимая для того, чтоб выгрузить массив данных с установки, его не выгружает.

(САМ ВОПРОС) Имеется функция: TDCReadToHistMT()
Код:
 KORETDC_API int WINAPI TDCReadToHistMT(unsigned *pHist, double StartTime, unsigned nPoints, int BitShift, int nExpt, int nChunk)
Описание к ней следующее:
Цитата:
pHist - A pointer to a block of memory that will receive the requested time histogram. Ensure that the memory is valid for writing and that there is enough room to hold nPoints worth of data i.e. 4*nPoints bytes

nPoints The number of points in the histogram (max 0x800000) and hence the range of memory that may be written to
Не без помощи здешних специалистов я, вроде как, научился пользоваться динамической памятью и выгружать в неё, что хочу. С другими функциями это работает, но с этой почему-то нет. Ниже привожу часть кода, отвечающую как раз за вывод данных:
Код:
        unsigned npoints = 10000;
	unsigned *array = new unsigned[npoints]();
	unsigned *sts = new unsigned; // status
	std::cout << array[0] << "\t" << array[1] << "\t" << array[2] << "\n"; // Просто смотрю, что у меня в массиве
	std::cout << "Read: " << Read_Hist_TDC(array, ROIStart, npoints) << "\n"; // Та самая TDCReadToHistMT()
	std::cout << array[0] << "\t" << array[1] << "\t" << array[2] << "\n"; // Ещё раз смотрю
	std::cout << "Start: " << ExpStart() << "\n"; // Начинает сбор данных
	std::cout << "Status: " << Status(sts, 0) << "\n"; // Говорит о том, закончен ли сбор данных или ещё идёт. Работает исправно.
	std::cout << "Status: " << *sts << "\n"; // Выдает, что эксп идёт
	Sleep(3000);// жду конца эксперимента (он вообще идёт 10 микросекунд)
	std::cout << "Status: " << Status(sts, 0) << "\n";
	std::cout << "Status: " << *sts << "\n"; // Выдает, что эксп закончен
	std::cout << array << "\n"; // Ради интереса смотрю на адрес
	std::cout << array[0] << "\t" << array[1] << "\t" << array[2] << "\n"; // Смотрю на массив, ничего не изменилось
	delete[] array;
	delete sts;
Так же важно отметить, что по документации функция (TDCReadToHistMT), которая считывает данные должна вызываться до начала эксперимента (ExpStart), так как она "ловит" начало эксперимента. Сделано это, очевидно, чтоб не терять данные. При окончании сбора она выгружает их в память.
Как видно, я несколько раз вызываю первые три значения массива, чтоб отследить когда массив заполняется, а когда нет (никогда). Также вызываю функцию Status несколько раз, чтоб убедится, что эксперимент закончен и данные выгружены (первый вызов Status - эксп. идёт, второй - эксп. законен и данные должны выгрузиться).

P.S. Все функции возвращают "нолики"

Последний раз редактировалось Leonid17; 20.01.2021 в 12:26.
Leonid17 вне форума Ответить с цитированием
Старый 20.01.2021, 12:37   #2
FrosyaZZ
Форумчанин
 
Регистрация: 16.11.2020
Сообщений: 243
По умолчанию

Вы же понимаете, что без СДК и/или доки это гадание на кофейной гуще. Тем более, что вы некоторые функции обернули, а сами вызовы так и не показали.

Для статуса не надо new звать, достаточно брать адрес. Может там ExpEnd надо вызывать. Может там в первых 3 элементах 0 и это нормально. Может возвращаемые "нолики" - это код ошибки, например, функция должна возвращать кол-во записанных элементов.
FrosyaZZ вне форума Ответить с цитированием
Старый 20.01.2021, 13:02   #3
Leonid17
 
Регистрация: 12.01.2021
Сообщений: 6
По умолчанию

FrosyaZZ,
Цитата:
что без СДК и/или доки это гадание на кофейной гуще. Тем более, что вы некоторые функции обернули, а сами вызовы так и не показали.
Переживал, что плохо воспримется. Всё-таки, документацию я сам прочесал и косяков не нашёл, поэтому подумал, что ошибка именно в незнании кода (ошибка, которую я заметить не могу из-за отсутствия опыта/понимания языка). Прикрепил, но ниже вкратце опишу основную.
ExpStart() = TDCStartExpt(void)
Цитата:
Resets the Cycles done counter and the TSEXPEND flag (see TDCStatus()) and then starts the experiment. It is assumed that all timing and mode setup will already have been performed. Normally an unload thread (see TDCReadToFileMT(), TDCReadToHistMT() & TDCReadToCountMT()) should already be running ready to catch the data that will then start to flow back from the TDC.
Вызывать ExpEnd или что-то подобное не требуется. Все остальные функции, необходимые для старта так же вызваны, всё проверил по 100 раз. Если какая-то из них не вызвана, но нужна - будет ошибка.
Если я правильно понял, что такое "обернуть функцию":
Код:
int Read_Hist_TDC(unsigned *adress, double StartTime, unsigned points) { // формирует массив данных по адресу
	READ_HIST read_TDC;
	read_TDC = (READ_HIST)GetProcAddress(hinstLib, "TDCReadToHistMT");
	int check = (read_TDC)(adress, StartTime, points, 1, 1, 512);
	return check;
int ExpStart() {
	START start_exp;
	start_exp = (START)GetProcAddress(hinstLib, "TDCStartExpt");
	int check = (start_exp)();
	return check;
Остальные, чтоб не грузить, не буду присылать, так-как они в процесс особо не лезут и влиять не должны
Цитата:
Для статуса не надо new звать, достаточно брать адрес.
Честно говоря, не понял, что значит "брать адрес".
Цитата:
Может там ExpEnd надо вызывать. Может там в первых 3 элементах 0 и это нормально. Может возвращаемые "нолики" - это код ошибки, например, функция должна возвращать кол-во записанных элементов.
Я понимаю, что вы имели ввиду этим абзацем, просто, как я уже говорил, не хотел присылать документацию, чтоб это не восприняли за моветон. Одно дело код посмотреть, другое дело, всю работу сделать. Но всё же на всякий случай напишу ответы во избежание недопонимания:
1. Как уже писал выше, конец эксперимента вызывать не надо, там даже функции такой нет. Есть только "Прервать эксперимент раньше положенного".
2. Там в первых элементов не ноль, так как до этого я вообще не инициализировал элементы массива и мне выдавало "мусор", причём каждый раз разный.
3. 0 - это код успешного выполнения функции, что справедливо для любой функции в данной библиотеке.
Вложения
Тип файла: pdf Kore TDC DLL reference z7230m.pdf (442.2 Кб, 1 просмотров)
Leonid17 вне форума Ответить с цитированием
Старый 03.02.2021, 10:35   #4
Leonid17
 
Регистрация: 12.01.2021
Сообщений: 6
По умолчанию

Проблему решил. Запустил совместимость программы с XP, вместо мусора появились правильные нули.
Leonid17 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не выгружается DLL (C#) из делфи. Masam Паскаль, Turbo Pascal, PascalABC.NET 4 25.12.2017 14:20
Excel не выгружается из памяти Raikhman Microsoft Office Excel 2 01.06.2016 13:12
память под массив Артэс Общие вопросы C/C++ 6 15.09.2012 22:32
динам.память.массив. Ам тя Помощь студентам 0 22.03.2010 19:23