Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Александровна
Статус: Академик
Рейтинг: 8000
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2630
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2284
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1665
Дата выхода:16.05.2011, 00:00
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:315 / 180
Вопросов / ответов:1 / 1

Вопрос № 183113: Здравствуйте! Прошу помощи в следующем вопросе: Имеется элемент очереди (дисциплина обслуживания FIFO): struct Queue { char * data; //указатель на данные Queue * next; //указатель на следующий элемент очереди } * begin; ...



Вопрос № 183113:

Здравствуйте! Прошу помощи в следующем вопросе:
Имеется элемент очереди (дисциплина обслуживания FIFO):
struct Queue
{
char * data; //указатель на данные

Queue * next; //указатель на следующий элемент очереди

} * begin; //указатель на начало очереди
функции
void Put(Queue** queue, char* data); // поместить данные в конец очереди;
char* Get(Queue** queue); // извлечь данные из начала очереди (при этом элемент удаляется из очереди);
void PrintQueue(Queue* queue); // вывод на экран содержимого очереди.
void WriteQueue(char * fname, Queue * pque); – функция записывает элементы очереди в файл;
Queue * ReadQueue(char * fname); – функция читает значения элементов из файла и создает очередь
оформить в виде библиотеки DLL;
создать новый проект для демонстрации работы с DLL и функциями;
необходимо использовать динамическое связывание без импорта
при динамическом связывании необходимо в проекте с главной программой объяв ить указатели на функции, содержащиеся в DLL.
Вот сами функции

Код:

#include "stdafx.h"
#include <Windows.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <locale>
#include <iostream>

using namespace std;

struct Queue
{
char * data; //указатель на данные
Queue * next; //указатель на следующий элемент очереди
} * begin; //указатель на начало очереди

void Put(Queue**, char*);
char* Get(Queue**);
void PrintQueue(Queue*);
void WriteQueue(char * fname, Queue * pque);
Queue * ReadQueue(char * fname);

int mai n(int argc, char* argv[])
{

return 0;
}

void WriteQueue(char * fname, Queue * pque)// функция записывает элементы очереди в файл
{
DWORD dwWrBytes;

HANDLE myFile = CreateFile(LPCTSTR(fname), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);

if (myFile == INVALID_HANDLE_VALUE)
{
cout << "Open file for writing failed\n";
exit(1);
}

while(pque)
{
DWORD size = strlen(pque->data)+1;
WriteFile(myFile, &size, sizeof(DWORD),&dwWrBytes, NULL);
WriteFile(myFile, pque->data, size, &dwWrBytes, NULL);
pque = pque->next;
}

CloseHandle(myFile);
}

Queue * ReadQueue(char * fname)// функция читает значения элементов из файла и создает очередь
{
DWORD dwRdBytes;
DWORD size;
char* y;

Queue *ReadQueue = NULL;
HANDLE myFile = CreateFile(LPCTSTR(fname), GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_AT TRIBUTE_NORMAL, NULL);

if(myFile == INVALID_HANDLE_VALUE)
{
puts("Open file for reading failed\n");
exit(1);
}

y = (char*)calloc(10,sizeof(char));
while(1)
{
ReadFile(myFile, &size, sizeof(DWORD), &dwRdBytes, NULL);
if (dwRdBytes == sizeof(DWORD))
{
ReadFile(myFile, y, size, &dwRdBytes, NULL);
if (dwRdBytes)
{
Put(&ReadQueue,y);
}
else
break;
}
else
break;
}
free(y);
CloseHandle(myFile);
return ReadQueue;
}
void Put(Queue** queue, char* data)// поместить данные в конец очереди
{
Queue* que1 = (Queue*)calloc(1,sizeof(Queue));
que1->data=(char*)malloc(strlen(data)+1);
strcpy(que1->data,data);

Queue* tmp=*queue;
if(!tmp)
*queue=que1;
else
{
while(tmp->next)
tmp = tmp->next;
tmp->next=que1;
}
}
char* Get(Queue** queue) // извлечь данные из начала о череди (при этом элемент удаляется из очереди)
{
Queue* tmp1 = *queue;
char* tmp;
if(!tmp1)
{
return 0;
}
else
{
tmp = tmp1->data;
*queue = tmp1->next;
return tmp;
}
}
void PrintQueue(Queue* queue) // вывод на экран содержимого очереди
{
while(queue)
{
cout << queue->data << endl;
queue = queue->next;
}
}



Еще есть мои попытки.. но как прикрепить проект к вопросу-не знаю...

Отправлен: 10.05.2011, 23:34
Вопрос задал: katbka (1-й класс)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, katbka!
Вы самостоятельно справились с задачей - молодец
Единственная ошибка: файл создается с "неправильным" именем, а не date.txt, как предполагалось.
Дело в том, что в DLL у Вас есть нехороший момент: Вы передаете имя файла, как ANSI-строку, а вызываете CreateFile(LPCTSTR(fname),...). По-умолчанию вызывается CreateFileW и LPCTSTR означает UNICODE-строку
Сделайте в WriteQueue так:
Код:

HANDLE myFile = CreateFileA(fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
И, аналогично, в подпрограме чтения
-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 13.05.2011, 00:20
Номер ответа: 267129
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267129 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное