Справка, восстанавливающая функциональность двойной загрузки личинки после драйвера и системы (Linux) обновление. Что я могу сделать?

Мне нужна помощь. У меня есть Windows 10 Single Language и также Ubuntu 16.04.2 на двойной загрузке (наследие). Установка подходила сначала, изменение размер раздела также подходило для получения пространства для Linux. Кроме того, Личинка работала приятно при первой начальной загрузке обеих операционных систем. Что я сделал позже уничтоженную начальную загрузку Windows 10. Я просто установил ROS Kinect и также драйвер Nvidia. Затем у меня была блестящая идея работать склонный - получают обновление, и склонный - получают обновление. К моему удивлению я видел, что личинка была обновлена и записала информацию о начальной загрузке снова (страх и слезы в моих глазах...). Загруженный еще раз затем Windows 10 прекратил загружаться. Теперь экран, кажется, представляет видеодрайвер, или проблемы с дисплеем (по диагонали расположенная с интервалами параллель дала незначительный сбой строки).

Единственная вещь, которую я попробовал, состояла в том, чтобы переустановить Linux с нуля и использовать материал nomodeset в конфигурации личинки... ни один не работал.

Текущая ситуация. Я не могу загрузить Windows, только Linux (который я думаю, не использует собственные драйверы Nvidia, вместо этого это, кажется, использует драйвер Intel HD video теперь). Даже переустановка Windows из Изображения не работает с USB-устройством, потому что приложение, которое я использую (winusb) с этой целью только, генерирует устройства загрузки для конфигурации UEFI (я использую наследие), таким образом установите сбои (недостающие драйверы: после начальной загрузки Windows, когда UEFI включен в BIOS, даже не загружается, если наследие включено в BIOS, отобразив сообщение как: пропавшие без вести нормальной начальной загрузки cfg). С чем я нуждаюсь в помощи:

  1. Восстановите надлежащую начальную загрузку с помощью Личинки для Windows 10 (если проблемой является конфигурация личинки). Я подозреваю, что это - конфигурация драйвера видео/карты.

  2. Если 1 сбой. Помогите мне создать загрузочный USB с изображением Windows 10 в Linux, который загружает и UEFI и конфигурации Прежней версии. Я уже загрузил и установил winusb (после того, как некоторое исследование в области того, как получить его от гостеприимного и также ошибки 256 от gui, это теперь работает из командной строки, хотя загружаясь только от режима UEFI).

  3. Если все остальное перестало работать, что я могу сделать для переустановки всего, удостоверившись, что я не собираюсь терять оба OSs?

Любая фактическая справка приветствуется.Спасибо.

1
задан 22 May 2017 в 18:11

10 ответов

С динамическим выделением, с помощью malloc:

int** x;

x = malloc(dimension1_max * sizeof(int*));
for (int i = 0; i < dimension1_max; i++) {
  x[i] = malloc(dimension2_max * sizeof(int));
}

[...]

for (int i = 0; i < dimension1_max; i++) {
  free(x[i]);
}
free(x);

Это выделяет 2D массив размера dimension1_max * dimension2_max. Так, например, если Вы хотите 640*480 массивов (f.e. пиксели изображения), использовать dimension1_max = 640, dimension2_max = 480. Можно затем получить доступ к использованию массива x[d1][d2] где d1 = 0.. 639, d2 = 0.. 479.

Но поиск на ТАК или Google также показывает другие возможности, например, в этом ТАК вопрос

Обратите внимание, что Ваш массив не выделит непрерывный регион памяти (640*480 байтов) в этом случае, которые могли дать проблемы с функциями, которые принимают это. Таким образом для получения массива удовлетворяют условие, заменяют malloc блок выше этим:

int** x;
int* temp;

x = malloc(dimension1_max * sizeof(int*));
temp = malloc(dimension1_max * dimension2_max * sizeof(int));
for (int i = 0; i < dimension1_max; i++) {
  x[i] = temp + (i * dimension2_max);
}

[...]

free(temp);
free(x);
74
ответ дан 1 November 2019 в 03:05

Начиная с C99 C имеет 2D массивы с динамическими границами. Если Вы хотите избежать, чтобы такой зверь был выделен на стеке (который Вы должны), можно выделить их легко сразу как следующий

double (*A)[n] = malloc(sizeof(double[n][n]));

и вот именно. Можно затем легко использовать его, как Вы используетесь для 2D массивов с чем-то как A[i][j]. И не забывайте, что один в конце

free(A);

Randy Meyers записал ряд статей, объясняющих массивы переменной длины (VLAs) .

73
ответ дан 1 November 2019 в 03:05

Если Вы знаете число столбцов во время компиляции, это довольно просто:

#define COLS ...
...
size_t rows;
// get number of rows
T (*ap)[COLS] = malloc(sizeof *ap * rows); // ap is a *pointer to an array* of T

можно рассматривать ap как любой 2D массив:

ap[i][j] = x;

, Когда Вы сделаны, Вы освобождаете его как [1 110]

free(ap);

, Если Вы не знаете число столбцов во время компиляции, но Вы работаете с компилятором C99 или компилятором C2011, который поддерживает массивы переменной длины, это все еще довольно просто:

size_t rows;
size_t cols;
// get rows and cols
T (*ap)[cols] = malloc(sizeof *ap * rows);
...
ap[i][j] = x;
...
free(ap);

, Если Вы не знаете число столбцов во время компиляции и Вы работаете с версией C, который не поддерживает массивы переменной длины, затем необходимо будет сделать что-то другое. При необходимости во всех элементах, которые будут выделены в непрерывном блоке (как эквидистантная антенная решетка), то можно выделить память как 1D массив, и вычислять 1D смещение:

size_t rows, cols;
// get rows and columns
T *ap = malloc(sizeof *ap * rows * cols);
...
ap[i * rows + j] = x;
...
free(ap);

, Если Вам не нужна память, чтобы быть непрерывными, можно следовать за двухступенчатым методом назначения:

size_t rows, cols;
// get rows and cols
T **ap = malloc(sizeof *ap * rows);
if (ap)
{
  size_t i = 0;
  for (i = 0; i < cols; i++)
  {
    ap[i] = malloc(sizeof *ap[i] * cols);
  }
}

ap[i][j] = x;

, Так как выделение было двухступенчатым процессом, освобождение также должно быть двухступенчатым процессом:

for (i = 0; i < cols; i++)
  free(ap[i]);
free(ap);
9
ответ дан 1 November 2019 в 03:05

malloc сделает.

 int rows = 20;
 int cols = 20;
 int *array;

  array = malloc(rows * cols * sizeof(int));

Относятся ниже статьи для help:-

http://courses.cs.vt.edu/~cs2704/spring00/mcquain/Notes/4up/Managing2DArrays.pdf

0
ответ дан 1 November 2019 в 03:05

Здесь работает код, который определяет подпрограмму make_3d_array для выделения многомерного 3D массива с N1, N2 и N3 элементы в каждом размере, и затем заполняет его со случайными числами. Можно использовать нотацию A[i][j][k] для доступа к ее элементам.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


// Method to allocate a 2D array of floats
float*** make_3d_array(int nx, int ny, int nz) {
    float*** arr;
    int i,j;

    arr = (float ***) malloc(nx*sizeof(float**));

    for (i = 0; i < nx; i++) {
        arr[i] = (float **) malloc(ny*sizeof(float*));

        for(j = 0; j < ny; j++) {
            arr[i][j] = (float *) malloc(nz * sizeof(float));
        }
    }

    return arr;
} 



int main(int argc, char *argv[])
{
    int i, j, k;
    size_t N1=10,N2=20,N3=5;

    // allocates 3D array
    float ***ran = make_3d_array(N1, N2, N3);

    // initialize pseudo-random number generator
    srand(time(NULL)); 

    // populates the array with random numbers
    for (i = 0; i < N1; i++){
        for (j=0; j<N2; j++) {
            for (k=0; k<N3; k++) {
                ran[i][j][k] = ((float)rand()/(float)(RAND_MAX));
            }
        }
   }

    // prints values
    for (i=0; i<N1; i++) {
        for (j=0; j<N2; j++) {
            for (k=0; k<N3; k++) {
                printf("A[%d][%d][%d] = %f \n", i,j,k,ran[i][j][k]);
            }
        }
    }

    free(ran);
}
0
ответ дан 1 November 2019 в 03:05

//использование, новое вместо malloc как использующий malloc, приводит к утечкам памяти, 'вводят код здесь

    int **adj_list = new int*[rowsize];       
    for(int i = 0; i < rowsize; ++i)    
    {

        adj_list[i] = new int[colsize];

    }
-1
ответ дан 1 November 2019 в 03:05

Нет никакого способа выделить все это сразу. Вместо этого создайте массив указателей, затем, для каждого указателя, создайте память для него. Например:

int** array;
array = (int**)malloc(sizeof(int*) * 50);
for(int i = 0; i < 50; i++)
    array[i] = (int*)malloc(sizeof(int) * 50);

, Конечно, можно также объявить массив как int* array[50] и пропустить первый malloc, но второй набор необходим для динамичного выделения необходимого устройства хранения данных.

возможно взломать способ выделить его в одноэтапном, но это потребовало бы пользовательской функции поиска, но пишущий, что таким способом, которым это будет всегда работать, может быть раздражающим. Пример мог быть L(arr,x,y,max_x) arr[(y)*(max_x) + (x)], затем malloc блок 50*50 ints или безотносительно и доступ с помощью того L макрос, например,

#define L(arr,x,y,max_x) arr[(y)*(max_x) + (x)]

int dim_x = 50;
int dim_y = 50;

int* array = malloc(dim_x*dim_y*sizeof(int));

int foo = L(array, 4, 6, dim_x);

, Но это намного более противно, если Вы не знаете эффектов того, что Вы делаете с макросом препроцессора.

-1
ответ дан 1 November 2019 в 03:05
int rows, columns;
/* initialize rows and columns to the desired value */

    arr = (int**)malloc(rows*sizeof(int*));
        for(i=0;i<rows;i++)
        {
            arr[i] = (int*)malloc(cols*sizeof(int));
        }
-2
ответ дан 1 November 2019 в 03:05

Основы

Массивы в c объявляются и получили доступ к использованию [] оператор. Так, чтобы

int ary1[5];

объявляет массив 5 целых чисел. Элементы пронумерованы от нуля так ary1[0] первый элемент, и ary1[4] последний элемент. Note1: нет никакой инициализации по умолчанию, таким образом, память, занятая массивом, может первоначально содержать что-либо. Note2: ary1[5] память доступов в неопределенном состоянии (который даже не может быть доступен для Вас), не делайте этого!

Многомерные массивы реализованы как массив массивов (массивов (...)). Так

float ary2[3][5];

объявляет массив 3 одномерных массивов 5 чисел с плавающей точкой каждый. Теперь ary2[0][0] первый элемент первого массива, ary2[0][4] последний элемент первого массива, и ary2[2][4] последний элемент последнего массива. '89 стандартов требуют, чтобы эти данные были непрерывны (секунда. A8.6.2 на странице 216 моего 2-го K&R. редактор), но, кажется, агностик на дополнении.

Попытка пойти динамичный больше чем в одном размере

Если Вы не будете знать размера массива во время компиляции, то Вы захотите динамично выделить массив. Заманчиво попробовать

double *buf3;
buf3 = malloc(3*5*sizeof(double));
/* error checking goes here */

который должен работать, если компилятор не заполняет выделение (засуньте дополнительное пространство между одномерными массивами). Могло бы быть более безопасно пойти с:

double *buf4;
buf4 = malloc(sizeof(double[3][5]));
/* error checking */

но так или иначе прием прибывает в разыменование времени. Вы не можете записать buf[i][j] потому что buf имеет неправильный тип. И при этом Вы не можете использовать

double **hdl4 = (double**)buf;
hdl4[2][3] = 0; /* Wrong! */

потому что компилятор ожидает hdl4 быть косвенным адресом двойного. И при этом Вы не можете использовать double incomplete_ary4[][]; потому что это - ошибка;

Таким образом, что можно сделать?

  • Сделайте строку и арифметику столбца сами
  • Выделите и сделайте работу в функции
  • Используйте массив указателей (механизм qrdl говорит о),

Сделайте математику сами

Просто вычислите смещение памяти к каждому элементу как это:

  for (i=0; i<3; ++i){
     for(j=0; j<3; ++j){
        buf3[i * 5 + j] = someValue(i,j); /* Don't need to worry about 
                                             padding in this case */
     }
  }

Выделите и сделайте работу в функции

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

void dary(int x, int y){
  double ary4[x][y];
  ary4[2][3] = 5;
}

Конечно, в этом случае ary4 локальная переменная, и Вы не можете возвратить ее: вся работа с массивом должна быть сделана в функции Вы вызов в функциях, которые это вызывает.

Массив указателей

Рассмотрите это:

double **hdl5 = malloc(3*sizeof(double*));
/* Error checking */
for (i=0; i<3; ++i){
   hdl5[i] = malloc(5*sizeof(double))
   /* Error checking */
}

Теперь hdl5 точки к массиву указателей, каждый из которых указывает на массив, удваиваются. Прохладный бит - то, что можно использовать нотацию двухмерной антенной решетки для доступа к этой структуре---hdl5[0][2] получает средний элемент первой строки---, но это - тем не менее, другой вид объекта, чем двухмерная антенная решетка, объявленная double ary[3][5];.

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

Обратите внимание что, так как у меня нет установки никакая защита, которую необходимо будет отслеживать размер всех массивов сами.

Арифметика

c не оказывает поддержки для вектора, матрицы или математики тензора, необходимо будет реализовать его сами или ввести библиотеку.

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

Внешние произведения означают больше циклов.

51
ответ дан 1 November 2019 в 03:05

Решил мою проблему, уничтожив жесткий диск и установив ТОЛЬКО UBUNTU. Избегайте grub, избегайте установки с флешки и, если можете, избегайте двойной загрузки.

0
ответ дан 8 December 2019 в 05:18

Другие вопросы по тегам:

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