Кодирование проблемы с помощью 2-го массива структур в другой структуре в C

Принятие Вас имеет сервер Linux и корневой доступ, пробует это. Это - простое решение, которое я нашел.

Создают новый каталог для следующих файлов и дают ему полные полномочия. (Мы можем сделать его более безопасным позже.)

mkdir test
chmod -R 777 test
cd test

Помещенный это в файл, названный bgping.

echo starting bgping
ping -c 15 www.google.com > dump.txt &
echo ending bgping

Примечание &. Команда ping будет работать в фоновом режиме, в то время как текущий процесс идет дальше к команде эха. Это проверит с помощью ping-запросов www.google.com 15 раз, который займет приблизительно 15 секунд.

Делают его исполняемым файлом.

chmod 777 bgping

Помещенный это в файл, названный bgtest.php.

<?php

echo "start bgtest.php\n";
exec('./bgping', $output, $result)."\n";
echo "output:".print_r($output,true)."\n";
echo "result:".print_r($result,true)."\n";
echo "end bgtest.php\n";

?>

, Когда Вы запрашиваете bgtest.php в своем браузере, необходимо получить следующий ответ быстро, не ожидая приблизительно 15 секунд команды ping для завершения.

start bgtest.php
output:Array
(
    [0] => starting bgping
    [1] => ending bgping
)

result:0
end bgtest.php

команда ping должна теперь работать на сервере. Вместо команды ping Вы могли выполнить Сценарий PHP:

php -n -f largejob.php > dump.txt &

Hope это помогает!

6
задан KMM 11 December 2009 в 08:56
поделиться

5 ответов

Кажется, вы можете создавать массивы переменной длины, поэтому вы работаете в системе C99 или в системе, которая ее поддерживает. Но не все компиляторы их поддерживают. Если вы хотите их использовать, вам не нужно объявление указателя arr в вашей структуре. Предполагая, что нет массивов переменной длины, давайте посмотрим на соответствующие части вашего кода:

/*data for each image*/
typedef struct
{ 
    int height;
    int width;
    pixelStruct *arr; /*pointer to 2-d array of  pixels*/
} imageStruct;

arr - это указатель на pixelStruct , а не на двумерный массив пикселей. Конечно, вы можете использовать arr для доступа к такому массиву, но комментарий вводит в заблуждение и намекает на недоразумение. Если вы действительно хотите объявить такую ​​переменную, сделайте что-то вроде:

pixelStruct (*arr)[2][3];

и arr будет указателем на «массив 2 из массива 3 из pixelStruct», что означает, что arr указывает на двумерный массив. Это не совсем то, что вам нужно. Честно говоря, вы не об этом заявляете, так что все хорошо. Но ваш комментарий предполагает неправильное понимание указателей в C, и это проявляется позже в вашем коде.

На этом этапе вам будет полезно прочитать хорошее введение в массивы и указатели в C, и действительно хорошее C для умников: массивы и указатели Криса Торека. В частности, убедитесь, что вы понимаете первую диаграмму на странице и все, что есть в определении функции f .

Поскольку вы хотите иметь возможность индексировать arr в Естественным образом используя индексы «столбец» и «строка», я предлагаю вам объявить arr как указатель на указатель. Итак, ваша структура становится:

/* data for each image */
typedef struct
{ 
    int height;
    int width;
    pixelStruct **arr; /* Image data of height*width dimensions */
} imageStruct;

Затем в вашей функции ReadImage вы выделяете необходимую память:

int i;
thisImage.arr = malloc(thisImage.height * sizeof *thisImage.arr);
for (i=0; i < thisImage.height; ++i)
    thisImage.arr[i] = malloc(thisImage.width * sizeof *thisImage.arr[i]);

Обратите внимание, что для ясности я не проверял ошибки на malloc . На практике вам следует проверить, вернул ли malloc NULL , и принять соответствующие меры.

Предполагая, что вся память выделена успешно, теперь вы можете прочитать свое изображение в thisImage.arr (точно так же, как вы делали для imageArr в исходной функции).

Как только вы закончите с thisImage.arr , обязательно освободите его:

for (i=0; i < thisImage.height; ++i)
    free(thisImage.arr[i]);

free(thisImage.arr);

На практике вам может потребоваться обернуть указанные выше части выделения и освобождения в соответствующие функции, которые выделяют и освобождают объект arr , и заботятся о проверке ошибок.

вы выделяете необходимую память:

int i;
thisImage.arr = malloc(thisImage.height * sizeof *thisImage.arr);
for (i=0; i < thisImage.height; ++i)
    thisImage.arr[i] = malloc(thisImage.width * sizeof *thisImage.arr[i]);

Обратите внимание, что для ясности я не проверял ошибки на malloc . На практике вы должны проверить, вернул ли malloc NULL , и принять соответствующие меры.

Если вся память выделена успешно, теперь вы можете прочитать свое изображение в thisImage.arr (точно так же, как вы делали для imageArr в исходной функции).

Как только вы закончите с thisImage.arr , обязательно освободите его:

for (i=0; i < thisImage.height; ++i)
    free(thisImage.arr[i]);

free(thisImage.arr);

На практике вам может потребоваться обернуть указанные выше части выделения и освобождения в соответствующие функции, которые выделяют и освобождают объект arr , и заботятся о проверке ошибок.

вы выделяете необходимую память:

int i;
thisImage.arr = malloc(thisImage.height * sizeof *thisImage.arr);
for (i=0; i < thisImage.height; ++i)
    thisImage.arr[i] = malloc(thisImage.width * sizeof *thisImage.arr[i]);

Обратите внимание, что для ясности я не проверял ошибки на malloc . На практике вы должны проверить, вернул ли malloc NULL , и принять соответствующие меры.

Если вся память выделена успешно, теперь вы можете прочитать свое изображение в thisImage.arr (точно так же, как вы делали для imageArr в исходной функции).

Как только вы закончите с thisImage.arr , обязательно освободите его:

for (i=0; i < thisImage.height; ++i)
    free(thisImage.arr[i]);

free(thisImage.arr);

На практике вам может потребоваться обернуть указанные выше части выделения и освобождения в соответствующие функции, которые выделяют и освобождают объект arr , и заботятся о проверке ошибок.

6
ответ дан 16 December 2019 в 21:41
поделиться

Я не думаю, что sizeof imageArr работает так, как вы ожидаете, когда вы используете массивы размера времени выполнения. Которые, кстати, являются своего рода "нишевой" функцией C99. Вам следует добавить несколько распечаток важных значений, таких как sizeof , чтобы увидеть, делает ли он то, что вы думаете.

Более ясным было бы использовать явное выделение массива:

thisImage.arr = malloc(thisImage.width * thisImage.height * sizeof *thisImage.arr);

Я также думаю, что это трудно (если даже возможно) реализовать такой "настоящий" 2D-массив. Я бы рекомендовал просто выполнить вычисление адреса самостоятельно, то есть получить доступ к пикселю, подобному этому:

unsigned int x = 3, y = 1; // Assume image is larger.
print("pixel at (%d,%d) is r=%d g=%d b=%d\n", x, y, thisImage.arr[y * thisImage.width + x]);

Я не понимаю, как требуемая информация измерения может быть связана с массивом во время выполнения; Я не думаю, что это возможно.

2
ответ дан 16 December 2019 в 21:41
поделиться

высота и ширина не определены; вы можете сначала инициализировать их, как в

thisImage.height = 10; thisImage.width = 20;

также,

  • что такое colorRGB?
0
ответ дан 16 December 2019 в 21:41
поделиться

* thisImage.arr = * imageArr; / * поместите imageArr в thisImage imagestruct *

Это не сработает. Вы должны объявить arr как colorRGB ** , выделить его соответствующим образом и т. Д.

0
ответ дан 16 December 2019 в 21:41
поделиться

похоже, вы пытаетесь скопировать массив по назначению. Вы не можете использовать для этого простой оператор присваивания, вы должны использовать некоторую функцию для копирования вещей, например memcpy.

*thisImage.arr = *imageArr;
thisimage.arr[0] = imagearr[0];

Вышеупомянутые операторы делают то же самое. Однако вряд ли это вызывает повреждение памяти

, поскольку вы работаете с двумерными массивами, убедитесь, что вы правильно их инициализировали. Глядя на код, не следует даже компилировать: массив объявлен как одномерный в структуре вашего изображения, а вы называете его двумерным?

0
ответ дан 16 December 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: