特殊相対性理論・電磁気学・数学

物理の暗黒面や面白い問題など。

balenaEtcherを使って ISOイメージをUSBに書き込んだ時のトラブル

2022-11-21 19:42:12 | プログラム・PC

1. まえがき

 Linux をWinとデュアルブートして使いたいと思い、UbutuのISOイメージを balenaEtcher を
 使って、USBに書き込んだ。すると、ドライブ名が D: E: と2つ出て、「フォーマットして下
 さい → フォーマットできません」となってしまった。

 壊れたかと思い色々調べ、Q/Aサイトで聞くと原因が分かり、修理できた。結論は、USBが
 Unix 形式のファイルに変更され、Winでアクセスできなかった。

 つまり、事後の USBの利用に問題があり、「balenaEtcher」より「Rufus」などの使用を推

 奨する。

2. 状況

 ・使用機器、ソフト

   Win11, USB2.0口、USB3.0(SanDisk, Buffalo)、Ubutu22.04LTS、balenaEtcher v1.7.9

 ・ダメになった USBはシステムの「ディスク管理」でも、「フォーマット」項目が表示さ
  れず、できなかった。ところが、Ubuntuからは全く問題なくアクセスできた。つまり、
  USBはハード的に壊れていなかった

3. 修理

 Q/Aサイトの回答にしたがって、コマンド形式の「diskpart」プログラムを使った。これは
 昔の「Fdisk」を使いやすくしたのとのこと。

 ・ターミナルにして、ディレクトリを「c:\Windows\System32」にする。
 ・ >diskpart ・・・・プログラム起動(変更注意が出る)
 ・ Diskpart>list disk ・・・・使用可能のディスクを表示
  ディスクに0以上の番号がついて表示されるので、容量から対象USBの番号を調べる。
  ここでは「1」だったとする。
 ・ Diskpart>select disk 1 ・・・・そのディスクを選択する
 ・ Diskpart>clearn ・・・・・初期化(どんなかは不明)
 ・ Diskpart>create partition primary ・・・・パーティションを作成
 ・以上で終わり。したがって、パーティションが壊れていた気がする。その後、format
  があるが、時間がかかるし、やらずとも復活した。

4. あとがき

 Win7のノートから、BIOSをバージョンアップにより Win10にして、10年、動作がのろく、
 キーボードも一部おかしくなったので買い換えた(冷却孔がうなるので負荷がかかってい
 る。その上のキー)。


 このため、PCを新しく買って、Linuxのデュアルブートを考えた。RufusでISOイメージ
 USBを作り、実行しようと
したがだめだった。Win11ではセキュアブートなどが邪魔を
 して、スマートに使えないど
ころか、BitLockerの番号入力が指示されとんでもない目に
 あった(セキュリティから当然か)。


 結局、内臓SSDの分割はおろか、外部HDDからの起動も断念した。さらに、「WSL」や
 「VirtualBox」も遅いとか不便でやめた。


 また、息子が Win10のノートPCを放り出したので、これに Ubuntu22.04LTS をデュアルブ
 -トしたら、しばらくして、Ubuntoは正常終了するのに、Win10の終了が、Winの起動に
 戻ってループ状態になる。やれやれ・・・Microsoftは・・・。


 はじめ、SanDiskやPC(THIRDWAVE DX-T5)を疑った。PCについては長らく、安い・安心で
 DELLを買っていたが、LANコネクタが無く、この機種にたどり着いた。mouseなどもあり、
 海外メーカでもなく使えると思った。
 
以上


C言語、ポインタアドレスの変更の注意

2019-11-12 10:26:05 | プログラム・PC

1. まえがき

 ひさしぶりに、プログラムしてみたら、大ボケしてしまった。

2. 問題

 整数値を格納する配列を受け取り,配列に格納された整数値のなかの最大値を示す配列のポイン
 タをポインタ変数 pmaxに格納する関数、setMax を作成し、この関数を呼び出し、動作するプ
 ログラムを作成する。

3. プログラム

 データが配列、 data[]に格納され、データ数をn、data[]の中の最大値を示すポインタを変数
 pmax に格納する。

 はじめ、呼び出しを「 if (setMax(data, N, pmax) == 0)」、関数を
 「int setMax(int data[], int n, int *pmax)」として、うまくいかなかった。何故かというと
 呼び出しで、変数pmaxに格納されているある変数のポインタ(指定されていないのでゴミ)を
 渡し、関数
の中では、そのポインタが示す場所の値を配列の最大値を示すポインタに変更してい
 た。


 正しくは、変数pmaxの場所を示すポインタ(アドレス)を渡して、その場所の値を書き換えな
 ければならなかった。


/* プログラム */
#include <stdio.h>

#define N 10

/* データ配列 data[]、データ数n、ポインタ変数のアドレス(ポインタ) ppmを受取り */
/* data[]の中の最大値を計算し、そのポインタをppmに返す */
int setMax(int data[], int n, int **ppm)
{
  int i, pos;

  if (n<1) return -1;
  pos=0;
  for (i=1; i<n; i++)
    if (data[i] > data[pos]) pos=i;

  *ppm=&data[pos];
  // printf(" data=%d,%d pos=%d\n", data[pos], **ppm, pos);
  return 0;
}

/* メイン */
int main()
{
  int data[N]={5,4,6,8,2,3,1,9,10,7};
  int *pmax;

  if (setMax(data, N, &pmax) == 0)
    printf("max : %d\n", *pmax);
  else
    printf("data error\n");

  return 0;
}

4. あとがき

 このようなプログラムは普通、書かない。呼び出し側でデータ配列は分かっているから、配
 列の添え字を返せばよく、このような誤りも無い。

 なお、デバックはあるサイトで行った、標準入力に制限があるようだが簡単なプログラムに
 は便利のようだ。

以上