русский
Germany.ruForen → Архив Досок→ Programmierung

Работа, ЯП и ООП

2729  1 2 3 alle
uscheswoi_82 коренной житель16.06.24 10:26
NEW 16.06.24 10:26 

Всем привет! Хотел бы поговорить насчёт ЯП, ООП и работы.

Короче недавно прочитал в интернете что язык Си++ плохой, но перепутал с Си, и начал воспоминать про Си. Вчера был жаркий спор насчёт Си++. Во-первых помимо ANSI C++ есть разные Си++ и фреймворки (MFC, .NET, VCL), во-вторых есть разные компиляторы - GCC, Visual C++, BCC, итд. Я пользуюсь гнутым Си++ (т.е. gnu cc) а среда разработки Embarcadero Dev-C++ с GCC. С тем с кем спорил, было сделано предположение оппонентом что Си++ придумали чтобы отказаться от указателей. Я где-то читал, что Си++ программисты часто используют на самом деле Си. Но там путаница с этим, если программист хочет пользоваться Си в Си++, то имхо нужно использовать допустим cstring, cmath, cstdio, итд. Допустим если в Си++ работаешь с string, и чтобы перейти из Си++ к Си есть магическая c_str. GCC не поддерживает format. Когда создаёшь Си++ проект, то Embarcadero Dev-C++ сгенерирует такой код:

#include <windows.h>
/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
 switch(Message) {
        case WM_DESTROY: {
            PostQuitMessage(0);
            break;
        }        
        /* All other messages (a lot of them) are processed using default procedures */
        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);
 }
 return 0;
}
/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
 WNDCLASSEX wc; /* A properties struct of our window */
 HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
 MSG msg; /* A temporary location for all messages */
 /* zero out the struct and set the stuff we want to modify */
 memset(&wc,0,sizeof(wc));
 wc.cbSize         = sizeof(WNDCLASSEX);
 wc.lpfnWndProc  = WndProc; /* This is where we will send messages to */
 wc.hInstance  = hInstance;
 wc.hCursor         = LoadCursor(NULL, IDC_ARROW);
 /* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 wc.lpszClassName = "WindowClass";
 wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
 wc.hIconSm         = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */
 if(!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
 }
 hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, /* x */
        CW_USEDEFAULT, /* y */
        640, /* width */
        480, /* height */
        NULL,NULL,hInstance,NULL);
 if(hwnd == NULL) {
        MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
 }
 /*
        This is the heart of our program where all input is processed and 
        sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
        this loop will not produce unreasonably high CPU usage
 */
 while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
        TranslateMessage(&msg); /* Translate key codes to chars if present */
        DispatchMessage(&msg); /* Send it to WndProc */
 }
 return msg.wParam;
}


Вы тут видите где-нибудь Си++ код? Вот я тоже его не вижу!


Когда обращаешься к Win32 API они все на си.Итак, было у меня уймо время, и было делать нечего, решил я подружить си т.е. Win32 API с си++, вот я сделал базовый класс. см. Control.cpp:

#include "control.h"
Control::Control(string text, int x, int y, int width, int height, HWND hParent, int id) {
 this->text = text;
 this->clss = "STATIC";
 this->x = x;
 this->y = y;
 this->width = width;
 this->height = height;
 this->hParent = hParent;
 this->id = id;
}
Control::Control(string text, int x, int y, int width, int height, HWND hParent) {
 this->text = text;
 this->clss = "STATIC";
 this->x = x;
 this->y = y;
 this->width = width;
 this->height = height;
 this->hParent = hParent;
 this->id = -1;
}
void Control::show() {
 if(this->id != -1)
        this->hThis = CreateWindow(this->clss.c_str(), this->text.c_str(), WS_CHILD | WS_VISIBLE, this->x, this->y, this->width, this->height, this->hParent, (HMENU)this->id, NULL, NULL);
 else
        this->hThis = CreateWindow(this->clss.c_str(), this->text.c_str(), WS_CHILD | WS_VISIBLE, this->x, this->y, this->width, this->height, this->hParent, NULL, NULL, NULL);
}
void Control::show(int style) {
 if(this->id != -1)
        this->hThis = CreateWindow(this->clss.c_str(), this->text.c_str(), WS_CHILD | WS_VISIBLE | style, this->x, this->y, this->width, this->height, this->hParent, (HMENU)this->id, NULL, NULL);
 else
        this->hThis = CreateWindow(this->clss.c_str(), this->text.c_str(), WS_CHILD | WS_VISIBLE | style, this->x, this->y, this->width, this->height, this->hParent, NULL, NULL, NULL);
}
void Control::show(int style, int exstyle) {
 if(this->id != -1)
        this->hThis = CreateWindowEx(exstyle, this->clss.c_str(), this->text.c_str(), WS_CHILD | WS_VISIBLE | style, this->x, this->y, this->width, this->height, this->hParent, (HMENU)this->id, NULL, NULL);
 else
        this->hThis = CreateWindowEx(exstyle, this->clss.c_str(), this->text.c_str(), WS_CHILD | WS_VISIBLE | style, this->x, this->y, this->width, this->height, this->hParent, NULL, NULL, NULL); 
}
void Control::set_text(string text) {
 this->text = text;
 SetWindowText(this->hThis, text.c_str());
}
string Control::get_text() {
 string data;
 data.resize(GetWindowTextLength(this->hThis)+1, '\0');
 GetWindowText(this->hThis, LPSTR(data.c_str()), GetWindowTextLength(this->hThis)+1);
 return data;
}
void Control::set_x(int x) {
 this->x = x;
 refresh(); 
}
int Control::get_x() {
 return this->x = x; 
}
void Control::set_y(int y) {
 this->y = y;
 refresh();
}
int Control::get_y() {
 this->y = y;
}
void Control::set_width(int width) {
 this->width = width;
 refresh(); 
}
void Control::set_height(int height) {
 this->height = height;
 refresh(); 
}
int Control::get_width() {
 return this->width;
}
int Control::get_height() {
 return this->height;
}
void Control::refresh() {
 MoveWindow(this->hThis, this->x, this->y, this->width, this->height, true);
}
void Control::set_class(string clss) {
 this->clss = clss;
}
bool Control::isClicked(WPARAM p) {
 if(this->id != -1 && this->id == LOWORD(p))
   return true;
 return false;
}
HWND Control::get_handle() {
  return this->hThis; 
}
Control::~Control() {
}


Control.h:

#ifndef CONTROL_H
#define CONTROL_H
#include <windows.h>
#include <string>
using namespace std;
class Control {
 private:
        HWND hParent;
        HWND hThis;
        string text;
        string clss;
        int x;
        int y;
        int width;
        int height;
        int id;
 private:
        void refresh();
 public:
        Control(string text, int x, int y, int width, int height, HWND hParent);
        Control(string text, int x, int y, int width, int height, HWND hParent, int id);
        virtual ~Control();
        void set_text(string text);
        string get_text();
        void set_x(int x);
        void set_y(int y);
        int get_x();
        int get_y();
        void set_width(int width);
        void set_height(int height);
        int get_width();
        int get_height();
        void show();
        void show(int style);
        void show(int style, int exstyle);
        bool isClicked(WPARAM p);
        void set_class(string clss);
        HWND get_handle();
};
#endif


Вот так я подружил Си++ с ComboBox:

#include "combobox.h"
ComboBox::ComboBox(string title, int x, int y, int width, int height, HWND hParent):
 Control(title, x, y, width, height, hParent) {
        Control::set_class("COMBOBOX");
}
ComboBox::ComboBox(string title, int x, int y, int width, int height, HWND hParent, int id) :
 Control(title, x, y, width, height, hParent, id) {
        Control::set_class("COMBOBOX");
}
void ComboBox::add_item(string text) {
 SendMessage(this->get_handle(), CB_ADDSTRING, 0, (LPARAM)text.c_str());
}
long ComboBox::get_count() {
 return SendMessage(this->get_handle(), CB_GETCOUNT, 0, 0);
}
long ComboBox::get_selected_index() {
 return SendMessage(this->get_handle(), CB_GETCURSEL, 0, 0);
}
string ComboBox::get_item(long item_index) {
 char buf[4096]; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 SendMessage(this->get_handle(), CB_GETLBTEXT, (WPARAM)item_index, (LPARAM)buf);
 string data(buf); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 return data;
}
void ComboBox::delete_item(long item_index) {
 SendMessage(this->get_handle(), CB_DELETESTRING, (WPARAM)item_index, 0);
}
void ComboBox::clear() {
 SendMessage(this->get_handle(), CB_RESETCONTENT, 0, 0);
}

Переход из Си++ в Си, и обратно, я считаю каким-то маразмом.


Мне дали чётко понять что моя нисша не C#, Си++, итд, а PHP! Короче лет 10 назад когда меня арбайтсамт дёргал чтобы я писал бевербунги, я писал бевербунги на программиста PHP, там требовались знания фреймворков, хотя я их не знал. Допустим пишу бевербунги в г. Мюнхен, там у одной фирмы стоит что нужно знать Symfony, в другой фирме нужно знать CakePHP, в третьей фирме Zend Framework, в четвёртой фирме Laravel. Фреймворки похожи, самая сложная наверное Symfony, т.к. проект создаётся через командную строку. Я освоил Kohana Framework и NuSOAP, кстати благодаря NuSOAP я смог подружить ASP.NET с PHP. После того как я поиграл с Kohana, я создал свой PHP фреймворк. Короче я работал с Reflection чтобы подружить с моим ORM, пишишь вот так:

<?php
class Messages extends ORM {
  /** 
   * @type:integer
   * @autoincrement:true
   * @unsigned:true
   * @primarykey:true
   */
  public $messageid;
  /**
   * @type:varchar(255)
   * @is_null:false
   * @annotation:"Author:"
   */
  public $author;
  /**
   * @type:text
   * @is_null:false
   * @annotation:"Message:"
   */
  public $message;
  /**
   * @type:DATETIME
   * @is_null:false
   * @annotation:"Date:"
   */
  public $date;
  /**
   * @type:varchar(255)
   * @is_null:false
   * @annotation:"E-mail:"
   */
  public $email;
}


А благодаря моему ORM т.е. если напишишь вот так

$obj_orm_messages = ORM::factory('messages');
//$arr_messages = $obj_orm_messages->select('', array('limit' => $int_limit, 'offset' => $int_offset, 'orderby' => array('date ASC')));

получал вот так:

CREATE TABLE Messages(messageid INTEGER NOT NULL AUTO_INCREMENT, author VARCHAR(255) NOT NULL, message TEXT NOT NULL, date DATETIME NOT NULL, PRIMARY KEY(messageid))

Когда программируешь на Symfony, Zend Framework, Laravel, итд. Есть определённые правила и табу. Допустим во вьюшках писать вот такое это табу:

<link rel="stylesheet" type="text/css" src="">
<script src=""></script>
<form method="post" action="">
<input type="text">
<input type="submit" value="send">
</form>

Вместо тегов используешь так называемые хелперы, это статичные методы определённых классов, т.е. фактически программируешь на структуироном языке. Потом я был ошарашен, но эти фреймворки загружаются в память где-то на 100 мбайт/пользователь.


Так-же в своём фреймворке я сделал так:

<?php
class DB {
  private $str_sql;
  private $is_order_by_first;
  private $is_non_query;
  private $is_group_by_first;
  // general 
  public function __construct() {
  }
  private function set_sql($str_sql) {
    $this->str_sql = $str_sql;
  }
  private function get_sql() {
    return $this->str_sql;
  }
  public function exec() {
    $str_sql = $this->get_sql();
    $arr_rows = array();
    $arr_config = Config::get('config');
    $obj_db = new mysqli($arr_config['database_connection']['server'], $arr_config['database_connection']['username'], $arr_config['database_connection']['password'], $arr_config['database_connection']['database']);
    $obj_result = $obj_db->query($str_sql);
    if($this->is_non_query == false) {
      if($obj_db->connect_errno == 0) {
        $int_index = 0;
        while($arr_row = $obj_result->fetch_assoc()) {
          $arr_rows[$int_index] = $arr_row;
          $int_index ++ ;
        }
      }
    $obj_db->close();
    return $arr_rows;
    }
    elseif($this->is_non_query == true) {
      $obj_db->close();
      return @$obj_db->insert_id;
    }
  }
  // SELECT Begin
  public function select($str_select = '*') {
    $this->is_order_by_first = true;
    $this->is_group_by_first = true;
    $this->is_non_query = false;
    $this->set_sql('SELECT ' . $str_select . ' ' );
    return $this;
  }
  public function from($str_from) {
    $str_sql = $this->get_sql();
    $this->set_sql($str_sql . ' FROM ' . $str_from);
    return $this;
  }
  private function where_abstract($str_where, $str_character, $str_type, $str_value) {
    $str_sql = ''; 
    $str_value2 = '';
    if($str_type == 'string') 
      $str_value2 = ' ' . $str_character . '\'' . $str_value . '\'';
    elseif($str_type == 'date') 
      $str_value2 = ' ' . $str_character . '\'' . $str_value . '\'';
    elseif($str_type == 'integer') 
      $str_value2 = ' ' . $str_character . $str_value;
    $str_sql .= $str_where . ' ' . $str_value2;
    return $str_sql;
  }
  public function where($str_where, $str_character, $str_type, $str_value) {
    $str_sql = $this->get_sql();
    $str_sql2 = $this->where_abstract($str_where, $str_character, $str_type, $str_value);
    $this->set_sql($str_sql . ' WHERE ' . $str_sql2);
    return $this;
  }
  public function or_where($str_where, $str_character, $str_type, $str_value) {
    $str_sql = $this->get_sql();
    $str_sql2 = $this->where_abstract($str_where, $str_character, $str_type, $str_value);
    $this->set_sql($str_sql . ' OR ' . $str_sql2);
    return $this;
  }
  public function where_open() {
    $str_sql = $this->get_sql();
    $this->set_sql($str_sql . ' ( ');
    return $this;
  }
  public function where_close() {
    $str_sql = $this->get_sql();
    $this->set_sql($str_sql . ' ) ');
    return $this;
  }
  public function and_where($str_where, $str_character, $str_type, $str_value) {
    $str_sql = $this->get_sql();
    $str_sql2 = $this->where_abstract($str_where, $str_character, $str_type, $str_value);
    $this->set_sql($str_sql . ' AND ' . $str_sql2);
    return $this;
  }
  public function join($str_type, $str_table) {
    $str_sql = $this->get_sql();
    $str_sql .= ' ' . $str_type . ' ' ;
    $str_sql .= $str_table;
    $this->set_sql($str_sql);
    return $this;
  }
  public function on($str_key1, $str_key2, $str_operator = '=') {
    $str_sql = $this->get_sql();
    $str_sql .= ' ' . $str_key1 . ' ' . $str_operator . ' ' . $str_key2;
    $this->set_sql($str_sql);
    return $this;
  }
  public function order_by($str_field, $str_key) {
    $str_sql = $this->get_sql();
    if($this->is_order_by_first == false) {
      $this->set_sql($str_sql . ', ' . $str_field . ' ' . $str_key);
      return $this;
    }
    if($this->is_order_by_first == true) {
      $this->is_order_by_first = false;
      $this->set_sql($str_sql . ' ORDER BY ' . $str_field . ' ' . $str_key);
      return $this;
    }
  }
  public function group_by($str_field) {
    $str_sql = $this->get_sql();
    if($this->is_group_by_first == false) {
      $this->set_sql($str_sql . ', ' . $str_field);
    }
    if($this->is_group_by_first == true) {
      $this->is_group_by_first = false;
      $this->set_sql($str_sql . ' GROUP BY ' . $str_field);
    }
    return $this;  
  }
  public function limit($int_offset, $int_count = '') {
    $str_sql = $this->get_sql();
    $str_sql2 = ' LIMIT ' . $int_offset;
    if($int_count != '') $str_sql2 .= ',' . $int_count;
    $this->set_sql($str_sql . $str_sql2);
    return $this;
  }
  // SELECT End
  // INSERT Begin
  public function insert($str_table, $arr_columns) {
    $str_sql = 'INSERT INTO ' . $str_table . '(';
    $this->is_non_query = true;
    $int_index = 0;
    foreach($arr_columns as $str_column) {
      $str_sql .= $str_column;
      if($int_index < count($arr_columns) - 1) 
        $str_sql .= ',';
      $int_index ++ ;
    }
    $str_sql .= ') '; 
    $this->set_sql($str_sql);
    return $this;
  }
  public function values($arr_values) {
    $str_sql = $this->get_sql();
    $str_sql .= ' VALUES(';
    $int_index = 0;
    foreach($arr_values as $str_key => $arr_value) {
      if($arr_value['type'] == 'string') 
        $str_sql .= '\'' . $arr_value['value'] . '\'';
      elseif($arr_value['type'] == 'date')
        $str_sql .= '\'' . $arr_value['value'] . '\'';
      elseif($arr_value['type'] == 'integer') 
        $str_sql .= $arr_value['value'];
      if($int_index < count($arr_values) - 1) 
        $str_sql .= ',';
      $int_index ++ ;
    }
    $str_sql .= ')';
    $this->set_sql($str_sql);
    return $this;
  }
  // INSERT End
  // UPDATE Begin
  public function update($str_table) {
    $str_sql = 'UPDATE ' . $str_table; 
    $this->set_sql($str_sql);
    return $this;
  }
  public function set($arr_fields) {
    $str_sql = $this->get_sql();
    $str_sql .= ' SET ';
    $int_index = 0;
    foreach($arr_fields as $arr_field) {
      if($arr_field['type'] == 'string') 
        $str_sql .= $arr_field['name'] . '=\'' . $arr_field['value'] . '\'';
      elseif($arr_field['type'] == 'date') 
        $str_sql .= $arr_field['name'] . '=\'' . $arr_field['value'] . '\'';
      elseif($arr_field['type'] == 'integer') 
        $str_sql .= $arr_field['name'] . '=' . $arr_field['value'];
      if($int_index < count($arr_fields) - 1) 
        $str_sql .= ',';
      $int_index ++ ;
    }
    $this->set_sql($str_sql);
    return $this;
  }
  // UPDATE End
  // DELETE Begin
  public function delete() {
    $this->is_non_query = true;
    $str_sql = 'DELETE ';
    $this->set_sql($str_sql);
    return $this;
  }
  // DELETE End
}


Поэтому у меня неприязнь к ООП.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#1 
uscheswoi_82 коренной житель16.06.24 10:34
NEW 16.06.24 10:34 
in Antwort uscheswoi_82 16.06.24 10:26

В 2007 когда учился в колледже, была практическая работа, у меня был свой проект, писал на MFC в Visual Studio 2005, для ресторанов для КПК 2003 (Windows CE), вот скриншот программы:


За это я получил тройбан


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#2 
uscheswoi_82 коренной житель16.06.24 10:40
NEW 16.06.24 10:40 
in Antwort uscheswoi_82 16.06.24 10:34

Спор был, по поводу ООП, а так-же что как замечательно что в JavaScript появились классы. А я считаю что можно использовать WebAssembly. В яндекс картах посылают не картинки а бинарный WebAssembly см. https://habr.com/ru/companies/yandex/articles/475382/. Тот-же блезор использует WebAssembly.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#3 
AlexNek патриот16.06.24 11:00
AlexNek
16.06.24 11:00 
in Antwort uscheswoi_82 16.06.24 10:40
Спор был, по поводу ООП,

Так и не понятно о чём. И слишком много разного всего, не осилил смущ

Можно выбрать одну единственную тему?

#4 
uscheswoi_82 коренной житель16.06.24 11:09
NEW 16.06.24 11:09 
in Antwort uscheswoi_82 16.06.24 10:40

Сейчас решил опять заняться MFC для Windows CE т.к. будут воспоминания на счёт Embedded см. https://groups.germany.ru/12994140000001/f/41025455.html?C..., но столкнулся с проблемой что там нет CFile см. https://learn.microsoft.com/ru-ru/cpp/mfc/reference/cfile-...,. Прям какой-то кашиваризм, приходится переходить с Си++ на Си и обратно, и делать какие-то костыли см.:

void CxxxxxDlg::OnBnClickedButton1()
{
  // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
  CString str;
  typedef struct {
        wchar_t descr[80];
        int day;
        int month;
        int year;
        int hour;
        int minutes;
  } DATABASE;

  this->description.GetWindowTextW(str);
  MessageBox(str);
  DATABASE db;
  wcscpy(db.descr, str);
  FILE *f;
  f = fopen("test.bin", "w+b");
  fwrite(&db, sizeof(db), 1, f);
  fclose(f);
}
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#5 
uscheswoi_82 коренной житель16.06.24 11:19
NEW 16.06.24 11:19 
in Antwort uscheswoi_82 16.06.24 11:09

Да вот ещё... это мой фреймворк т.к. гнутый си т.е. GCC не поддерживает format, хотя на дворе 2024 год, пришлось вот так делать:

// -lwinmm
#include <stdio.h>
#include "multimedia.h"
Multimedia::Multimedia(string filename, string device) {
 this->id = "snd1";
 this->filename = filename;
 this->device = device;
 this->handle = NULL;
}

Multimedia::Multimedia(string filename, string device, HWND handle) {
 this->id = "snd1";
 this->filename = filename;
 this->device = device;
 this->handle = handle;
}

void Multimedia::open() {
 string cmd = "open \"";
 cmd += this->filename;
 cmd += "\" type ";
 cmd += this->device;
 cmd += " alias ";
 cmd += this->id;
 cmd += " wait ";
 /*if(this->handle != NULL) {
        
        int ihwnd = DECLARE_HANDLEt(this->handle);
        stringstream s();
        s << ihwnd;
        cmd += "window ";
        cmd += s;
 }*/ 
 mciSendString(cmd.c_str(), NULL, 0, NULL);
}


void Multimedia::play() {
 string cmd = "play ";
 cmd += this->id;
    mciSendString(cmd.c_str(), NULL, 0, 0);
}

void Multimedia::play_video() {
 string cmd = "play ";
 cmd += this->id;
// cmd += " window at 10 80 300 225 notify";
 //cmd += " notify ";
    mciSendString(cmd.c_str(), NULL, 0, 0); 
}


void Multimedia::stop() {
 string cmd = "stop ";
 cmd += this->id;
    mciSendString(cmd.c_str(), NULL, 0, 0);
}

void Multimedia::close() {
 string cmd = "close ";
 cmd += this->id;
    mciSendString(cmd.c_str(), NULL, 0, 0);
}

// new 06.09 25.06.2021
void Multimedia::set_window() {
 char buf[64]; /// !!!!!!!!!!!!!!!!!!!!!
 sprintf(buf, "%p", this->handle); /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 string str(buf); /// !!!!!!!!!!!!!!
 string cmd = "window ";
 cmd += this->id;
 cmd += " handle ";
 cmd += str;
 //MessageBox(NULL, cmd.c_str(), "", MB_OK);
 mciSendString(cmd.c_str(), NULL, 0, 0);
}
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#6 
uscheswoi_82 коренной житель16.06.24 11:42
NEW 16.06.24 11:42 
in Antwort AlexNek 16.06.24 11:00
Можно выбрать одну единственную тему?

Просто если не знаешь особенности современных фреймворков, то делать в IT нечего. А джоб центр давит, нужно резюме отсылать. У каждого фреймворка свой подход, если программируешь на Symfony, то и думать нужно так же, если не дай бог будешь использовать костыли, то могут уволить. Symfony весит очень много, там используется свой шаблонизатор Twig, и ORM Doctrine. Благодаря Symfony имхо можно сказать появился Razor и EntityFramework.


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#7 
uscheswoi_82 коренной житель16.06.24 11:58
NEW 16.06.24 11:58 
in Antwort uscheswoi_82 16.06.24 11:42

Если чего-то нет, то приходится какие-то костыли писать. В Си++ опасно костыли писать т.е. переходить с Си++ на Си, т.к. там работаешь с Сишными типами данных, а это опасно, есть так скажем переполнение буфера см. http://www.freebsd.org.ru/developers-handbook/x1169.html, вот например переполнение буфера:

char buf[512];
HWND hwndField1;
...
GetWindowText(hwndField, buf, GetWindowTextLength(hwndField));


Чтобы не было переполнения буфера то делаем так:

char *buf;
HWND hwndField1;
...
buf = (char *)malloc(GetWindowTextLength(hwndField)+1);
GetWindowText(hwndField, buf, GetWindowTextLength(hwndField));


Но нужно память освобождать т.е. написать free, иначе будет утечка памяти см. https://habr.com/ru/companies/piter/articles/432072/:

free(buf);


Для этого наверное Си++ и придумали, чтобы не морочить голову программисту с переполнением буфера и утечкой памяти.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#8 
AlexNek патриот16.06.24 14:13
AlexNek
NEW 16.06.24 14:13 
in Antwort uscheswoi_82 16.06.24 11:42
А джоб центр давит, нужно резюме отсылать.

ну так и отсылайте, а знаешь или не знаешь это уже вторично. Всё знать невозможно, выберите себе одно что то и на этом концентрируйтесь.

Мне кажется, что на PHP больше вакансий, чем на С/С++. Никто не хочет этой фигнёй больше заниматься.

#9 
Срыв покровов патриот16.06.24 16:21
NEW 16.06.24 16:21 
in Antwort AlexNek 16.06.24 14:13

дед опять забыл принять таблетки

#10 
uscheswoi_82 коренной житель16.06.24 23:39
NEW 16.06.24 23:39 
in Antwort AlexNek 16.06.24 14:13
ну так и отсылайте, а знаешь или не знаешь это уже вторично.

Нет я просто лишь хотел объяснить чтобы была дискуссия. Спор был что Си отстой, а Си++ супер.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#11 
AlexNek патриот16.06.24 23:50
AlexNek
NEW 16.06.24 23:50 
in Antwort uscheswoi_82 16.06.24 23:39
Спор был что Си отстой, а Си++ супер

Ну так с этого и нужно было начинать, а то прокручивать дофига.зло


Это будет неверно для сравнения многих языков.

Для каждого случая использования будут свои критерии. Да и еще при этом смотря с какой стороны посмотреть.

Так что нужны еще чёткие рамки в которых будет проводится сравнение.

#12 
uscheswoi_82 коренной житель17.06.24 00:41
NEW 17.06.24 00:41 
in Antwort Срыв покровов 16.06.24 16:21
дед опять забыл принять таблетки

Я не дед, а молодой человек, мне кажется я моложе тут многих, т.к. молодёжь не сидит в форумах, я сижу только потому, потому-что я на пенсии. Вы так про меня пишите лишь только потому, потому-что просто вам не нравится моя точка зрения. Просто вам я не нравлюсь лишь потому-что я высказывал свою точку зрения в этом форуме - я не был против локдауна, и привился три раза, и я был против одной женщины. Насчёт этой женщины, ну тут люди сами были виноваты, они писали мне в этом форуме, что они за эту женщину лишь потому, чтобы государство перестало таким как я платить пособие (хотя я пока не сижу на шеи у государства), т.е. чтобы арбайтслоз отменили (чтобы те кто работают меньше налогов платить допустим социальщикам, и чтобы они больше денег зарабатывать могли, т.е. чтобы шло больше им в карман), и чтобы безработных и больных иностранцев таких как я из Германии повыселяли. Ну я ведь лишь высказывал своё мнение в этом форуме, и всё. Но я никого ни к чему не призывал и никому ничего не наязывал, а своё мнение высказывать можно. Вот я четвёртый раз не привился, и относился легкомысленно т.е. маски не носил когда их уже отменили, и я подцепил где-то эту корону, и я очень тяжело болел, хотя в этом форуме многие уверяли что это неопасная болезнь, типа как простуда или грипп. Сначало у меня запахи напрочь пропали, потом немного слух ухудшился т.е. стал я хуже слышать (допустим раньше я слышал шум автобуса когда закрыто окно, а сейчас не слышу), каша в голове и плюс провыла памяти появились, а так-же проблемы со сном, т.е. у меня появился лонг-синдром после того как я переболел короной. А у pодственника несколько зубов выпало после того как он переболел короной. У меня мaть по образованию биолог, биохимик, и биоинформатик, и у неё есть докторская, и она хорошо знает что такое ковид.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#13 
uscheswoi_82 коренной житель17.06.24 00:51
NEW 17.06.24 00:51 
in Antwort uscheswoi_82 17.06.24 00:41

Тут где-то 3-4 айтишника против меня лишь потому, потому-что у нас противоположенные взгляды на жизнь и на быт. Для них высокие налоги и локдаун это ай ай ай. В Германии налоги и раньше были высокими, раньше не было ещё минималки, т.е. брали на ту зарплату, на которую договоришься с начальством.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#14 
zavuch постоялец17.06.24 10:52
zavuch
NEW 17.06.24 10:52 
in Antwort uscheswoi_82 16.06.24 10:26
начал воспоминать про Си. Вчера был жаркий спор насчёт Си++.


С папаней споришь или в своей пустой группе сам с собой, где ты один закрылся и никого не пускаешь? Где ты спорил?

#15 
zavuch постоялец17.06.24 10:55
zavuch
NEW 17.06.24 10:55 
in Antwort Срыв покровов 16.06.24 16:21
дед опять забыл принять таблетки





#16 
uscheswoi_82 коренной житель17.06.24 15:08
NEW 17.06.24 15:08 
in Antwort zavuch 17.06.24 10:52, Zuletzt geändert 17.06.24 16:25 (uscheswoi_82)
Где ты спорил?

Дома спорил, сeстра приезжала на выходных к нам в гости, она живёт за 300-400 км., я ей рассказал, вот и спорили. А причиной спора была вот это, просто я сижу в одном форуме старый DOS, и одна дама написала что ей Си и Си++ не нравятся, ей больше мол фортран нравится, и там один программист написал, что Си++ придумали чтобы можно было программиста выгнать с работы. Поэтому я в своём дневнике создал тему Си. У той дамы какой-то старый вроде бы как я понял фортран, я ей посоветовал поставить что-нибудь посвежее допустим Open Watcom Fortran. Сейчас я решил тоже изучать Fortran. А ветку Embedded я создал, потому-что мне понравилась тема про программирования приложение под Android в том форуме старый DOS, если у меня вдруг будет здоровье, у меня есть вот такая книжка, а там есть диск с Eclipse, JDK, и ADT, я установлю это всё, и буду тоже программировать и делиться со всем миром. Мне этот андроид раньше на психику сильно действовал, просто когда программируешь и запускаешь на эмуляторе то иногда программа вылетает, то сам эмулятор Андроид долго стартуется, то не спервого раза App в эмуляторе запускается, вот эта книжка с диском:




Но мне нравится Windows CE и Windows CE .NET, поэтому в первую очередь затрону Windows CE, а не Android.


А oтец мне говорил ещё в 2010 году что моя ниша это PHP, чтобы я все остальные языки не изучал и про них забыл, а изучал только PHP, просто у нас в Казахстане был бизнес, и мы купались в деньгах, а потом когда приехали в Германию один из руководитель проекта из Microsoft рассказал что эра классического Visual Basic заканчивается, и компания Microsoft переходит на новую технологию .NET, мы с oтцoм в интерет магазине купили две новых Visual Studio 2008, я купил себе Professional Edition, т.к. я хотел чтобы был Microsoft SQL Server Developer Edition, а oтец купил себе Standard Edition, т.к. ему не нужен был SQL Server, но мы купили Upgrade версию, а Upgrade версия стоила на 50% дешевле, чем полная версия, но чтобы установить её можно было иметь любую другую среду разработки (допустим Borland C++ Builder, Delphi, Eclipse, или любую предыдущую версию Visual Studio). Мне в колледже дали Microsoft Visual Studio 2005 Professional Edition, поэтому установка прошла гладко, а у oтца на компьютере был установлен Visual Basic 6.0 и Eclipse, поэтому у него тоже всё установилось.



В Visual Studio 2008 был конвертатор из Visual Basic 6.0 в VB.NET 3.5. Короче мы импортировали приложение написанное на Visual Basic 6.0, но оно не хотело импортировать, т.к. там много кастомных элементов, там был какой-то мостик между Visual Basic 6.0 и VB.NET. Покуда наша программа в Казахстане работала 24 часа в сутки и 7 дней в неделю, было принято решение использовать безоконные элементы управления см. https://learn.microsoft.com/ru-ru/windows/win32/winauto/wi..., чтобы не было утечки памяти. Эти безоконные элементы управления не имеют окно, т.е. HWND, поэтому они меньше памяти занимали. Эти безоконные элементы были на установочном CD Visual Basic 6.0 Professional Edition, эти компоненты нужно было устанавливать отдельно с CD.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#17 
uscheswoi_82 коренной житель17.06.24 15:53
NEW 17.06.24 15:53 
in Antwort uscheswoi_82 17.06.24 15:08

Вот так мы вставляли Windows Less ActiveX в VB6 проект:


Была отдельная даже от MSDN документация по этим элементам:


В проекте они выглядели вот так:



А импортировали приложение написанное на Visual Basic 6.0 в Visual Studio 2008 VB.NET 3.5:



Там были специальные .NET компоненты для совместимости с Visual Basic 6.0:



Но из-за кастомных ActiveX многое что не хотелось импортироваться в VS2008 VB.NET 3.5. Поэтому мы поставили крест на приложение, которое мы разработали на Visual Basic 6.0, и перешли на другую сферу, и на PHP.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#18 
uscheswoi_82 коренной житель17.06.24 16:04
NEW 17.06.24 16:04 
in Antwort uscheswoi_82 17.06.24 15:53

Когда я учился в колледже, учителя мне вбивали в голову что Open Source это хорошо, а продукты MS это зло, хотя в колледже мне дали бесплатно Microsoft Visual Studio 2005 Professional Edition, Microsoft Access 2003, Microsoft Windows 2008 Server. Это даётся только для учебных заведений, и только для студентов. Когда мы ездили на компьютерную выставку в г. Мюнхен, учитель сказал если мы подайдём к стойки MS, нам поставят плохую оценку. Когда мы были на выставке, мы просто прогуляли занятия. Там каждый год в колледже ездиют на компьютерную выставку, она каждый год осенью.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#19 
AlexNek патриот17.06.24 19:35
AlexNek
NEW 17.06.24 19:35 
in Antwort uscheswoi_82 17.06.24 00:51
3-4 айтишника против меня

Сложно сказать, что кто то действительно против кого-то. Всего лишь личные ощущения.

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

Но пож. не надо больше ненужных картинок и портянок кода. Если сильно хочется, сделайте зип вложение и туда всё запихайте.

#20 
1 2 3 alle