Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: KF121
Дата сообщения: 01.03.2011 17:25

Цитата:
if ( !CreateProcess(NULL, CmdLine.c_str(), NULL, NULL, FALSE, NULL, NULL, NULL, &cf, &pi))
{
ErrorLog->Add(CURDATA + "*** Error: Unable to start process UnZip.exe");
ErrorLog->Add(CURDATA + "*** Error: Command line: " + CmdLine);
ErrorLog->Add(CURDATA + GetLastErrorEx);
SaveErrorLogTo(FileName);
eax = 0x03;
return;
}

WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, &eax);


а если платформо не зависимое, копайте в POSIX или java
Автор: AdVocem
Дата сообщения: 01.03.2011 17:43

Цитата:
а если платформо не зависимое, копайте в POSIX или java

спасибо, попробую
Автор: karakurt2
Дата сообщения: 01.03.2011 17:52
AdVocem
[more=вот так ещё попробуйте]

Код:
[no]
static intptr_t
execGhostscript(int const inputPipeFd,
const char ghostscript_device[],
const char outfile_arg[],
int const xsize, int const ysize,
int const xres, int const yres,
const char input_filespec[], int const verbose) {

const char *arg0;
const char *ghostscriptProg;
const char *deviceopt;
const char *outfileopt;
const char *gopt;
const char *ropt;
int fdStdIn;
intptr_t pid;
int rc;

findGhostscriptProg(&ghostscriptProg);

setvbuf(stdin, NULL, _IONBF, 0);

fdStdIn = _dup(_fileno(stdin));
if (fdStdIn < 0) {
    pm_error("failed to save the input pipe descriptor");
}

/* Put the input pipe on Standard Input */
rc = _dup2(inputPipeFd, _fileno(stdin));
if (rc != 0) {
    pm_error("failed to put the input pipe on Standard Input");
}

_close(inputPipeFd);

asprintfN(&arg0, "gswin32c.exe");
asprintfN(&deviceopt, "-sDEVICE=%s", ghostscript_device);
asprintfN(&outfileopt, "-sOutputFile=%s", outfile_arg);
asprintfN(&gopt, "-g%dx%d", xsize, ysize);
asprintfN(&ropt, "-r%dx%d", xres, yres);

/* -dSAFER causes Postscript to disable %pipe and file operations,
which are almost certainly not needed here. This prevents our
Postscript program from doing crazy unexpected things, possibly
as a result of a malicious booby trapping of our Postscript file.
*/

if (verbose) {
pm_message("execing '%s' with args '%s' (arg 0), "
"'%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'",
ghostscriptProg, arg0,
deviceopt, outfileopt, gopt, ropt, "-q", "-dNOPAUSE",
"-dSAFER", "-");
}

pid = _spawnl(_P_NOWAIT, ghostscriptProg, arg0, deviceopt, outfileopt, gopt, ropt, "-q",
"-dNOPAUSE", "-dSAFER", "-", NULL);

        if (pid < 0) {
pm_error("execl() of Ghostscript ('%s') failed, errno=%d (%s)",
ghostscriptProg, errno, strerror(errno));
        }

        rc = _dup2(fdStdIn, _fileno(stdin));
        if (rc != 0) {
            pm_error("failed to restore input pipe descriptor");
        }

        _close (fdStdIn);

return pid;
}

[/no]
Автор: mrherbrooks
Дата сообщения: 03.03.2011 09:01

Цитата:
Помогте разобраться с OpenMP

хм. даже на msdn есть кошерный мануал по вводной части. что уж говорить вообще об интернетах.
Автор: Red Planet
Дата сообщения: 03.03.2011 11:05
Добрый день! Есть ли функция заполнения списка с контролем, такая, чтобы не заносились значения, которые уже в списке присутствуют?
Автор: karakurt2
Дата сообщения: 03.03.2011 16:20
std::set?
Автор: Red Planet
Дата сообщения: 03.03.2011 17:58
karakurt2, спасибо, но это, как мне кажется, не подойдет для моей задачи. У меня будет список, в котором хранится огромное количество данных. Некоторые из них в ходе выполнения придется удалять из середины, так что здесь подойдет только список. Или нет?
Автор: karakurt2
Дата сообщения: 03.03.2011 18:02
std::set реализован в форме чёро-красного дерева, вроде бы. так что удаление из произвольного места будет иметь сложность log(n)
Автор: V0lt
Дата сообщения: 03.03.2011 20:40
В стандартных c/c++ библиотеках есть что-то вроде массива битов?
Автор: karakurt2
Дата сообщения: 03.03.2011 20:41
std::vector<bool>
Автор: V0lt
Дата сообщения: 03.03.2011 21:06
Чего-то мне не понятно как с этим vector<bool> работать.
Есть массив BYTE massiv[20] и переменная int a. Мне нужно взять несколько последовательных битов (например 7 бит начиная с 43-го) и положить их в переменную a.
Автор: akaGM
Дата сообщения: 03.03.2011 21:46
V0lt
используй, например, маски:

a = massiv[4] & 0x007f00000L;
Автор: V0lt
Дата сообщения: 03.03.2011 22:10
akaGM
Я примерно так и делаю. Но хотелось, что-то более удобное типа GetBits(43, 7).
Автор: akaGM
Дата сообщения: 03.03.2011 22:12
V0lt
ну так сам напиши один раз, делов-то...
Автор: V0lt
Дата сообщения: 03.03.2011 22:26
придется наверное. просто со временем надоедает велосипеды выдумывать.
Автор: Abs62
Дата сообщения: 03.03.2011 22:34
V0lt
Ну так напиши. Что-нибудь вроде:

Код: unsigned GetBits(unsigned char *massiv, int bit_nom, in bit_num)
{
unsigned value=0;
for(int i=0;i<bit_num;i++) {
if(massiv[(bit_nom+i)/8] & (1<<((bit_nom+i)%8)) value|=(1<<i);
}
return value;
}
Автор: mrherbrooks
Дата сообщения: 05.03.2011 12:59

Цитата:
В стандартных c/c++ библиотеках есть что-то вроде массива битов?

std::bitset
Автор: karakurt2
Дата сообщения: 05.03.2011 13:27
boost::dynamic_bitset

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


Код:
[no]
#include "stdafx.h"

#include <iostream>
#include <iomanip>
#include <boost\dynamic_bitset.hpp>

template <class Block, class Alloc, class BlockOutputIterator>
BlockOutputIterator get_bit_range(boost::dynamic_bitset<Block, Alloc> const& b, std::size_t begin, std::size_t end, BlockOutputIterator out)
{
    Block value = 0;
    int pos = 0;
    while (begin != end)
    {
        value |= (b.test(begin) << pos++);
        if (pos == boost::dynamic_bitset<Block,Alloc>::bits_per_block)
        {
            pos = 0;
            *out = value;
            ++out;
            value = 0;
        }
        ++begin;
    }
    if (pos != 0)
    {
        *out = value;
    }
    return out;
}


int _tmain(int argc, _TCHAR* argv[])
{
    typedef unsigned char block_type;

    boost::dynamic_bitset<block_type> original(std::string("00011110000111100011100010001111000110001110000001111111000"));

    std::cout << original << std::endl;

    block_type value[2] = { 0, 0 };
    get_bit_range(original, 3, 12, value);

    std::cout << std::hex << std::setfill('0') << std::setw(2) << (int) value[0]
        << std::setw(2) << (int) value[1] << std::endl;

    return 0;
}
[/no]
Автор: V0lt
Дата сообщения: 05.03.2011 21:08
Abs62, mrherbrooks, karakurt2
Спасибо, обещаю воспользоваться вашими советами, но не скоро.
Автор: Elena777777
Дата сообщения: 06.03.2011 10:49
Помогите.


#include <iostream.>
#include <stdlib.h>
#include <string.h>
using namespace std;

class kartochka{
public:
    char * slovo;
};

class DICTIONARY{
    char * name;
    kartochka Massiv[3];    
public:
    DICTIONARY (){        
    }
    DICTIONARY(const DICTIONARY & Ob){
        name = new char[20];
        strcpy(name, Ob.name);
    }
    int F (DICTIONARY Ob){
        return 1;
    }
};

int main(){
    DICTIONARY Ob;
    DICTIONARY Ob_1;
    cout << endl << " "; // ***** (1) *****
    Ob.F(Ob_1);
    return 0;
}


А вопрос в следующий.

Если написать строчку (1) в таком же виде, как в программе, то конструктор копий почему-то ни с того, ни с сего выделяет динамически память name, также в массиве Massiv[3] выделяет динамически память под Massiv[0].slovo и т.д.

НО!!!!!!! Если строчку (1) переписать в виде cout << endl; то как и положено динамически указанные выше участки памяти не выделяются.

P.S Надеюсь я написала доступно.

Добавлено:
#include <iostream.>
#include <stdlib.h>
#include <string.h>
using namespace std;

class kartochka{
public:
char * slovo;
};

class DICTIONARY{
char * name;
kartochka Massiv[3];
public:
DICTIONARY (){
}
DICTIONARY(const DICTIONARY & Ob){

}
int F (DICTIONARY Ob){
return 1;
}
};

int main(){
DICTIONARY Ob;
DICTIONARY Ob_1;
cout << endl << "";
Ob.F(Ob_1);
return 0;
}

Даже при пустом конструкторе копий происходит тот же глюк. Конструктор пустой а память выделяется, но стоит написать cout << endl; то выделения памяти не происходит.
Автор: kotlomoy
Дата сообщения: 06.03.2011 18:37
1. Как вы определяете, что память выделяется?
2. В первом примере память под name должна выделяться в любом случае.
Автор: Elena777777
Дата сообщения: 07.03.2011 14:36
Спасибо. С предыдущим вопросом вроде разобрались.

Но есть ещё вопрос.

Если запускать программу через Run, то она вылетает, выдавая ошибку, что происходит обращение к нулевой памяти, память не может быть прочитана. И не производит дальнейших вычислений. Но, если проверять код c помощью F10, то программа благополучно работает, выполняя все действия и вычисления, вплоть до завершения.
Из-за чего это может быть?
Автор: Garrett
Дата сообщения: 07.03.2011 15:14
Отладчик в VC++ иничиализирует все переменные сам. Поэтому у тебя всё ОК.
А при выполнении без отладчика, переменные никем не инициализируются. Ты должен это делать сам.
Автор: Elena777777
Дата сообщения: 07.03.2011 15:30
Тогда поясню проблемму подробнее. Ошибка возникает, если я ввожу следующую строку:

DICTIONARY Ob_4 = Ob.operator + (Ob_1);


Ob, Ob_1, Ob_4 - объекты.

Также прописан конструктор копий, и деструктор. Написаны, вроде бы правильно.


Автор: kotlomoy
Дата сообщения: 07.03.2011 15:38
Elena777777
Мне кажется вы небравильно вызываете оператор. Если в классе есть оператор сложения, то вызываться он должен так: Ob + Ob_1
Автор: Elena777777
Дата сообщения: 07.03.2011 15:42
И так тоже вызывали. Результат один и тот же. Это же вроде бы эквмвалентные вызовы
Автор: kotlomoy
Дата сообщения: 07.03.2011 16:23
Elena777777
А гдe объявлены Ob и Ob_1?
Автор: Elena777777
Дата сообщения: 07.03.2011 18:41
В main
Автор: karakurt2
Дата сообщения: 07.03.2011 23:27
Elena777777
у Вас задействован только конструктор по умолчанию, который ничего не делает. следовательно, в памяти, которая выделена под объект, находится мусор. разбиритесь, с понятием конструктор объекта, по Вашему коду видно, что здесь есть непонимание.
Автор: Abs62
Дата сообщения: 07.03.2011 23:50
Мусор находится в переменной name, которая при копировании попадает в strcpy(name, Ob.name). Со всеми вытекающими.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.