Используя Studio управления MSSQL я перешел таблицы с MySQL OLE DB. Щелкните правой кнопкой по своей базе данных и перейдите к "Задачам-> Данные Экспорта", оттуда можно определить источник MsSQL OLE DB, источник MySQL OLE DB и создать отображения столбца между этими двумя источниками данных.
Вы, скорее всего, захотите установить базу данных, и таблицы заранее на месте назначения MySQL (экспорт захочет составить таблицы автоматически, но это часто приводит к отказу). Можно быстро составить таблицы в MySQL с помощью "Задач->, Генерируют Сценарии" путем щелчка правой кнопкой по базе данных. Как только Ваши сценарии создания сгенерированы, необходимо будет ступить через и искать/заменять ключевые слова и типы, которые существуют в MSSQL к MySQL.
, Конечно, Вы могли также скопировать базу данных как нормальный и найти утилиту, которая восстановит резервное копирование MSSQL на MySQL. Я не уверен, существуете ли Вы как бы то ни было.
В дополнение к основным проблемам, на которые указал Нед Батчелдер , гораздо более тонкая проблема заключается в том, что распределитель должен возвращать адрес, который правильно выровнен для любого выделяемого объекта . На некоторых платформах (x86) это может не иметь значения, за исключением проблем с производительностью, но на многих платформах это полный отказ.
Мне также пришлось выполнить приведение (char *)
для выполнения ] stack
арифметика указателя (вы не можете выполнять арифметику указателя для типов void *
).
И вы должны заключить выражение в скобки в макросе MAX_MEMORY
. Я не думаю, что без них вы столкнетесь с какими-либо проблемами с приоритетом, поскольку все операторы с более высоким приоритетом, чем умножение, в любом случае не будут правильным синтаксисом. С макросами всегда лучше перестраховаться, чем сожалеть. (Есть по крайней мере одно исключение, когда оператор []
может связываться только с 2
, а не со всем выражением MAX_MEMORY
, но было бы очень странно увидеть MAX_MEMORY [arrayyname]
, даже если он синтаксически действителен).
На самом деле, я бы сделал это перечислением.
Вы, вероятно, можете упростить распределитель, вернув блок памяти, который правильно выровнен для любого базового типа данных в системе (возможно, 8-байтовое выравнивание):
/* Note: the following is untested */
/* it includes changes suggested by Batchelder */
#include <stdio.h>
#include <unistd.h>
enum {
kMaxMemory = 1024 * 1024 * 2, /* 2MB of memory */
kAlignment = 8
};
void *stack = NULL; /* pointer to available stack */
void * memoryAlloc( size_t size) {
void *pointer;
size = (size + kAlignment - 1) & ~(kAlignment - 1); /* round size up so allocations stay aligned */
if (stack == NULL)
stack = sbrk(kMaxMemory); /* give us system memory */
pointer = stack; /* we always have space :) */
stack = (char*) stack + size; /* move in stack forward as space allocated */
return pointer;
}
Есть несколько проблем:
Вы объявляете указатель
в середине функции, что недопустимо в C.
Вы устанавливаете указатель на стек + размер
, но вы хотите, чтобы это был просто стек
. В противном случае вы возвращаете указатель на конец выделяемого блока памяти. В результате, если ваш вызывающий абонент использует весь размер
байтов в этом указателе, он будет перекрываться с другим блоком памяти. Если вы получаете блоки разного размера в разное время, у вас будет два вызывающих пользователя, пытающихся использовать одни и те же байты памяти.
Когда вы выполняете stack + = size
, вы увеличиваете стек.
не размером
байтов, а размером size
void *, который почти всегда больше.
Во-первых, как уже отметили другие, вы объявляете переменные в середине блока, что разрешено только в C99, но не в C89 / 90. Т.е. мы должны сделать вывод, что вы используете C99.
Во-вторых, вы определяете свою функцию в стиле K&R (без типа параметра), но в то же время не объявляете тип параметра позже. Таким образом, вы полагаетесь на правило "implicit int", которое запрещено в C99. Т.е. мы должны сделать вывод, что вы не используете C99. Это уже противоречие с «первой» частью. (Кроме того, для представления концепции «размера объекта» принято использовать беззнаковые типы. size_t
- это специальный тип, обычно используемый для этой цели).
В-третьих, вы используете арифметику указателей для указателя void *
, что всегда недопустимо как в C89 / 90, так и в C99. Я даже не знаю, что из этого можно сделать:)
Пожалуйста, решите, какой язык вы пытаетесь использовать, и мы пойдем дальше.